Rust bench 実行時間測定

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

Programming Rust: Fast, Safe Systems Development