Help us understand the problem. What is going on with this article?

Rustで実行時間の計測

More than 3 years have passed since last update.

最初に

#[bench]使えとか言われそうですけど、stable でも使えるし許して! :stuck_out_tongue_closed_eyes:
rustc 1.16.0 (30cf806ef 2017-03-10) (stable) で動作確認しています。

やってみる

特に何も考えず

test.rs
use std::time::{Duration, Instant};
use std::thread::sleep;

fn main() {
  let start = Instant::now();
  // 1.234秒休んでみる
  sleep(Duration::from_millis(1234));

  let end = start.elapsed();
  println!("{}.{:03}秒経過しました。", end.as_secs(), end.subsec_nanos() / 1_000_000);
  // 1.234秒経過しました。
}

std::time::Instant::now()で計測開始時間を取得。
elapsed()で計測開始からの経過時間を取得という流れです(形式はstd::time::Duration)。
Durationはas_secsで秒を、subsec_nanosで秒未満の経過時間をナノ秒(1ナノ秒=1/1,000マイクロ秒=1/1,000,000ミリ秒)単位で取得します。
簡単ですね! :blush:

マクロにしてみる

test2.rs
use std::time::{Duration, Instant};
use std::thread::sleep;

macro_rules! measure {
  ( $x:expr) => {
    {
      let start = Instant::now();
      let result = $x;
      let end = start.elapsed();
      println!("計測開始から{}.{:03}秒経過しました。", end.as_secs(), end.subsec_nanos() / 1_000_000);
      result
    }
  };
}
fn main() {
  let x = 824;
  measure!({
    sleep(Duration::from_millis(x));
  });
  // 計測開始から0.824秒経過しました。
  // measure!(sleep(Duration::from_millis(x))); <- これでも可
}

ベタ書きなたらい回し関数で計測(上記マクロを使用)

tarai.rs
fn tarai(x: i32, y: i32, z: i32) -> i32 {
  if x <= y {
    return y;
  } else {
    tarai(tarai(x - 1, y, z), tarai(y - 1, z, x), tarai(z - 1, x, y))
  }
}
fn main() {
  // Rustではブロックは式なので複文でも問題なし。
  let tarai_result = measure!({
    println!("たらい回し始め!");
    tarai(15, 10, 0) // <- この行に;(セミコロン)を付けてしまうと、
                     //    計測ブロックが()を返す=tarai_resultの値が()になるので注意!
  });
  // 結果も受け取れます。返却値がある関数を計測しやすくなるかな??
  println!("たらい回した結果は{}でした。", tarai_result);
}
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした