この記事は
Rustにおいて、とある T
型とOption<T>
型に対して演算を行うのではどれぐらい速度が異なるのかを調べた。結論として、差はなかった。
その際に書いたコードは、Rustでベンチマークを取りたいとき一般にテンプレートとして使えると思ったので、Githubに上げた。
※デモコードの型をusize
からf64
に変換し、乱数を発生させるようにした(2021/06/01更新)
ベンチマークのためのディレクトリ構成
.
├── benches
| └── bench.rs
├── src
| └── lib.rs
└── Cargo.toml
ベンチマークを取るためには以下の手順を踏む。
--lib
クレートを作成するsrc/lib.rs
にベンチを取りたい関数を記述するbenches
ディレクトリを新規作成するbenches/bench.rs
ファイルと作成し、ベンチマークのためのコードを記述する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