スポンサーリンク

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

プログラミング
0
(0)

この記事は

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上に公開しておく。

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

この記事は役に立ちましたか?

星をクリックして、評価してください!

現在の平均評価 0 / 5. 評価した人数: 0

お役に立てたようで嬉しいです!

著者SNSをフォローしていただけると、更新情報が手に入ります。

記事がご期待に沿えなかったようで、申し訳ありません…。

是非、改善点を教えてください!

この記事において改善すべき点や、追加で知りたかったことは何ですか?

コメント