Rustでベンチマークを取るテンプレート―TとOption<T>の速度比較

Rust
Sponsored

この記事は

Rustにおいて、とある T型とOption<T>型に対して演算を行うのではどれぐらい速度が異なるのかを調べた。結論として、差はなかった。

その際に書いたコードは、Rustでベンチマークを取りたいとき一般にテンプレートとして使えると思ったので、Githubに上げた。

※デモコードの型をusizeからf64に変換し、乱数を発生させるようにした(2021/06/01更新)

ベンチマークのためのディレクトリ構成

.
├── benches
|   └── bench.rs
├── src
|   └── lib.rs
└── Cargo.toml

ベンチマークを取るためには以下の手順を踏む。

  1. --libクレートを作成する
  2. src/lib.rsにベンチを取りたい関数を記述する
  3. benchesディレクトリを新規作成する
  4. benches/bench.rsファイルと作成し、ベンチマークのためのコードを記述する
  5. cargo +nightly benchで実行する

記述例

src/lib.rs

use ndarray::*;
use rand::distributions::{Uniform, Distribution};

/// Calculation of Matrix
pub fn raw(mat: &mut Array2<f64>, ud: Uniform<f64>) {
    Zip::from(mat)
        .for_each(|a| {
            *a = ud.sample(&mut rand::thread_rng());
        });
}

/// Calculation of Option<Matrix>
pub fn option(op_mat: &mut Option<Array2<f64>>, ud: Uniform<f64>) {
    match op_mat.as_mut() {
        Some(mat) => {
            Zip::from(mat)
                .for_each(|a| {
                    *a = ud.sample(&mut rand::thread_rng());
                });
        }
        None => {}
    }
}

benches/bench.rs

#![feature(test)]

extern crate test;
use ndarray::*;
use rand::distributions::Uniform;
use option_bench::*;

#[bench]
fn raw_bench(b: &mut test::Bencher) {
    let ud = Uniform::new::<f64, f64>(0.0, 1.0);
    let mut mat = Array2::zeros((1000, 1000));
    b.iter(|| raw(&mut mat, ud))
}

#[bench]
fn option_bench(b: &mut test::Bencher) {
    let ud = Uniform::new::<f64, f64>(0.0, 1.0);
    let mut op_mat = Some(Array2::zeros((1000, 1000)));
    b.iter(|| option(&mut op_mat, ud))
}

実行結果

PS C:\Rust\codes\option_bench> cargo +nightly bench
    Finished bench [optimized] target(s) in 0.11s

running 0 tests

test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.01s
     Running unittests (target\release\deps\bench-92450b1d6cb5f4dc.exe)

test option_bench ... bench:  24,757,800 ns/iter (+/- 18,808,471)
test raw_bench    ... bench:  24,180,470 ns/iter (+/- 18,167,577)

test result: ok. 0 passed; 0 failed; 0 ignored; 2 measured; 0 filtered out; finished in 13.51s

2つの実行速度に差がないことがわかった。今後はより積極的にOption<T>を使っていこうと思う。

テンプレートとして

今回作成したクレートは、ベンチマークを取る際のテンプレートとして使えると思ったので、Github上に公開しておく。

GitHub - doraneko94/option_bench: Rust benchmark for calculation of Array & Option. Please use this as a template of benchmarking.
Rust benchmark for calculation of Array & Option. Please use this as a template of benchmarking. - doraneko94/option_bench

Comments