LoginSignup
33
10

More than 5 years have passed since last update.

Rustで実行時間の計測

Posted at

最初に

#[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);
}
33
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
33
10