Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Criterion-rs

cipepser
November 24, 2020

 Criterion-rs

下町.rs#4の発表資料です

https://shitamachi.connpass.com/event/194244/

cipepser

November 24, 2020
Tweet

More Decks by cipepser

Other Decks in Programming

Transcript

  1. 自己紹介 • cipepser(さいぺ) • リードエンジニア@LayerX ◦ R&Dチーム ◦ Anonify •

    経歴 ◦ SIerで証券系ネットワーク設計、構築 ◦ Fintech会社で新規事業の立ち上げ • 趣味プロジェクト ◦ コンパイラ ◦ 正規表現ジェネレータ ◦ protocol buffersデコーダ ◦ (最近)みんなのデータ構造
  2. ベンチマークのコード pub fn max<T: PartialOrd + Default>(input: Vec<T>) -> Option<T>

    { if input.len() == 0 { return None; } let ret = input.into_iter() .fold(T::default(), |max, v| { if max < v { v } else { max } }); Some(ret) } Vec<T>を受け取り、最大値を返すmax関数の実行速度を計測 #![feature(test)] extern crate test; #[cfg(test)] mod tests { use super::*; use test::Bencher; #[bench] fn bench_max(b: &mut Bencher) { b.iter(|| { let mut input = std::iter::repeat(0) .take(10000) .collect::<Vec<i32>>(); input.push(10); max(input); }); } } ※今回はsetupも含めた
  3. cargo benchを実行してみると... https://doc.rust-lang.org/1.7.0/book/benchmark-tests.html ❯ cargo bench Compiling shitamachi04 v0.1.0 (/Users/cipepser/sand/github.com/cipepser/shitamachi04)

    error[E0554]: `#![feature]` may not be used on the stable release channel --> src/lib.rs:1:1 | 1 | #![feature(test)] | ^^^^^^^^^^^^^^^^^ error: aborting due to previous error stableでは実行できない!
  4. nightlyで実行 • nightlyであれば実行できる • 10,000個の要素から最大値を探 すのに2,939 ns/iter ❯ rustup run

    nightly cargo bench Compiling shitamachi04 v0.1.0 (/Users/cipepser/sand/github.com/cipepser/shitamachi04) Finished bench [optimized] target(s) in 1.04s Running target/release/deps/shitamachi04-503585c75795d752 running 1 test test tests::bench_max ... bench: 2,939 ns/iter (+/- 420) test result: ok. 0 passed; 0 failed; 0 ignored; 1 measured; 0 filtered out
  5. ベンチマージの実装 [dev-dependencies] criterion = "0.3" [[bench]] name = "my_bench" harness

    = false #[macro_use] extern crate criterion; use criterion::Criterion; use shitamachi04::max; fn criterion_benchmark(c: &mut Criterion) { c.bench_function("my benchmark", |b| b.iter( || { let mut input = std::iter::repeat(0) .take(10000) .collect::<Vec<i32>>(); input.push(10); max(input); } )); } criterion_group!(benches, criterion_benchmark); criterion_main!(benches); ❯ tree -I target . ├── Cargo.lock ├── Cargo.toml ├── benches │ └── my_bench.rs └── src └── lib.rs 2 directories, 4 files ディレクトリ構成 benches/my_bench.rs Cargo.toml
  6. 実行結果 ❯ cargo bench Compiling shitamachi04 v0.1.0 (/Users/cipepser/.go/src/github.com/cipepser/shitamachi04) Finished bench

    [optimized] target(s) in 2.63s Running target/release/deps/shitamachi04-4b13c6b7e81a9987 running 0 tests test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out Running target/release/deps/my_bench-1036f4d6f71359c2 Gnuplot not found, using plotters backend my benchmark time: [2.8872 us 2.8955 us 2.9045 us] change: [-3.2087% -2.7053% -2.2805%] (p = 0.00 < 0.05) Performance has improved. Found 3 outliers among 100 measurements (3.00%) 3 (3.00%) high mild 2回目のベンチマーク結果: 前回との差分が表示される
  7. Libraのベンチマーク • Criterion.rsが使われている箇所 ◦ language(move) ◦ crypto ◦ network ◦

    safety_rules • crypto: Ed25519署名の測定例 libra/ed25519.rs at 77fd504bc09a9517247a3a4f85d468698dba6a94 · libra/libra https://github.com/libra/libra/blob/77fd504bc09a9517247a3a4f85d468698dba6a94/crypto/crypto/benches/ed25519.rs
  8. substrateのベンチマーク • Criterion.rsが使われている箇所 ◦ arithmetic ◦ core ◦ trie ◦

    api ◦ system ◦ client ◦ node • node: execute blockの測定例 substrate/bench.rs at 17922fe47af9992abe0b4a74469df5d80980159b · paritytech/substrate https://github.com/paritytech/substrate/blob/17922fe47af9992abe0b4a74469df5d80980159b/bin/node/executor/benches/bench.rs
  9. • stable Rustではベンチマークが実行できない • Criterion.rsを紹介 ◦ stable Rustで利用可能 ◦ パフォーマンスの統計がわかる

    ▪ 2回目以降は前回との比較も ◦ ベンチマーク結果をグラフで表示 ◦ 本発表で利用した実装は以下で公開 ▪ https://github.com/cipepser/shitamachi04 ◦ もう少し詳細も含めて LayerXのscrapboxに記載 ▪ 引数ありのベンチマークや、ベンチマークのグルーピングなど ▪ https://scrapbox.io/layerx/Rust%E3%83%99%E3%83%B3%E3%83%81%E3%83%9E% E3%83%BC%E3%82%AF%E3%81%AF%E3%81%98%E3%82%81 • Libraとsubstrateでの利用例を紹介 まとめ
  10. References • Benchmark tests https://doc.rust-lang.org/1.7.0/book/benchmark-tests.html • bheisler/criterion.rs: Statistics-driven benchmarking library

    for Rust https://github.com/bheisler/criterion.rs • paritytech/substrate https://github.com/paritytech/substrate/ • libra/libra: Libra’s mission is to enable a simple global payment system and financial infrastructure that empowers billions of people. https://github.com/libra/libra