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. ベンチマークツール
    Criterion.rsの紹介
    cipepser
    2020/11/21
    下町.rs #4

    View Slide

  2. 自己紹介
    ● cipepser(さいぺ)
    ● リードエンジニア@LayerX
    ○ R&Dチーム
    ○ Anonify
    ● 経歴
    ○ SIerで証券系ネットワーク設計、構築
    ○ Fintech会社で新規事業の立ち上げ
    ● 趣味プロジェクト
    ○ コンパイラ
    ○ 正規表現ジェネレータ
    ○ protocol buffersデコーダ
    ○ (最近)みんなのデータ構造

    View Slide

  3. アジェンダ
    1. 標準のベンチマーククレート
    2. Criterion.rsの紹介
    3. Criterion.rsの使い方
    4. Criterion.rsを使ったプロジェクトの紹介

    View Slide

  4. 標準のベンチマーククレート

    View Slide

  5. ベンチマークのコード
    pub fn max(input: Vec)
    -> Option {
    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を受け取り、最大値を返す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::>();
    input.push(10);
    max(input);
    });
    }
    }
    ※今回はsetupも含めた

    View Slide

  6. 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では実行できない!

    View Slide

  7. 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

    View Slide

  8. Criterion.rsの紹介

    View Slide

  9. Criterion.rs概要
    ● stable Rustで利用可能
    ● パフォーマンスの統計がわかる
    ○ 2回目以降は前回との比較も
    ● ベンチマーク結果をグラフで表示
    ● githubのstar数: 1.5k (発表日現在)
    https://github.com/bheisler/criterion.rs

    View Slide

  10. Criterion.rsの使い方

    View Slide

  11. ベンチマージの実装
    [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::>();
    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

    View Slide

  12. 実行結果
    ❯ 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回目のベンチマーク結果:
    前回との差分が表示される

    View Slide

  13. 「target/criterion/report/index.html」でグラフと統計値も見れる

    View Slide

  14. Criterion.rsを使ったプロジェクトの紹介

    View Slide

  15. 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

    View Slide

  16. 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

    View Slide

  17. ● 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での利用例を紹介
    まとめ

    View Slide

  18. 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

    View Slide

  19. ブロックチェーン技術をもとに、「新たな経済基盤」をつくりだす。
    それは、信用や評価のあり方を変え、
    業務や生産をはじめとした経済活動の摩擦を解消し、
    この国の課題である生産性向上を実現する。
    私たちは、そう信じて行動し続けます。
    ブロックチェーンが実装された社会、
    そこには、これまでの延⻑にはないまったく新しい可能性が広がっている。
    LayerXは、デジタル社会への発展を後押しすることで、
    経済史に新たな1ページを刻んでいきます。

    View Slide