最初に
#[bench]
使えとか言われそうですけど、stable でも使えるし許して!
※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ミリ秒)単位で取得します。
簡単ですね!
マクロにしてみる
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);
}