rustである関数の実行時間を測定したいときがあったのでメモ
環境
rustc --version rustc 1.24.0-nightly (f8af59d95 2017-12-13)
rustc-test
クレートが必要なのでCargo.tomlに記述する。
extern crate test; use test::test::Bencher; struct Fx { a: f64, b: f64, dx: f64, f: fn(f64) -> f64, } impl Fx { fn new(a: f64, b: f64, step: u64, f: fn(f64) -> f64) -> Fx { Fx { a: a, b: b, dx: (b - a) / (step as f64), f: f, } } } fn integral(prim: &Fx) -> f64 { let a = prim.a; let b = prim.b; let dx = prim.dx; let f = prim.f; let step = ((b - a) / dx) as u32; let mut sum = 0.0; for n in 0..step { let x = a + dx * (n as f64); let bar = f(x) * dx; sum = sum + bar; } sum } #[cfg(test)] mod tests { use super::*; fn f(x: f64) -> f64 { x * x + 1.0 } #[test] fn int_test() { let f = f; let prim = Fx::new(0.0, 1.0, 1000000, f); println!("{}", integral(&prim)); } #[bench] fn int_bench(b: &mut Bencher) { let f = f; let prim = Fx::new(0.0, 1.0, 1000000, f); b.iter(|| { let p = test::black_box(&prim); integral(p); }); } } fn main() { println!("Hello, thread World!"); }
雑に積分をする。
Bencherのiterに渡したクロージャ-を含む関数を何回も実行して(int_bench)
実際のクロージャーの実行にかかった時間を平均しているようだ。
しかし最適化によって実行結果がすでに計算されていたりすると、
実行時間が0nsと出てしまうので
black_box
で値を渡すことによってコンパイル時に計算する程度の最適化を抑制する。
実行
テストを実行するなら
cargo test
ベンチマークを実行するなら
cargo bench
Programming Rust: Fast, Safe Systems Development
- 作者: Jim Blandy,Jason Orendorff
- 出版社/メーカー: Oreilly & Associates Inc
- 発売日: 2017/12/21
- メディア: ペーパーバック
- この商品を含むブログを見る