#insight #benchmark #stats #parts

perfos

Benchmark parts of your Rust code with stats insights

6 releases

new 0.2.4 Feb 9, 2025
0.2.3 Feb 9, 2025
0.1.0 Feb 9, 2025

#156 in Machine learning

Download history 300/week @ 2025-02-04

300 downloads per month
Used in sabita

MIT license

2.5MB
829 lines

Perfos

Lint/Security/Dependencies/Tests crates.io version

Benchmark parts of your Rust code with stats insights

Use

Install

cargo add perfos

Use

In this example, we are benchmarking the Sabita package which aims to generate and solve Sudokus

use perfos::{
    benchmark::{benchmark, Config},
    file::FilePolicy,
    runner::BenchmarkFunction,
    time
};

use sabita::core::Grid;

use std::time::Duration;

////////////////////////////////////////

fn get_perfs() {
    let version = env!("CARGO_PKG_VERSION");
    let file_path = format!("benchmarks/v{version}.benchmark");

    benchmark(Config {
        file_path: Some(file_path),
        default_file_policy: Some(FilePolicy::Rewrite),
        nb_buckets_around_avg: 5,
        nb_iterations: 50,
        functions: vec![
            BenchmarkFunction {
                name: "generate".to_string(),
                f: Box::new(benchmark_one_generate),
            },
            BenchmarkFunction {
                name: "solv10".to_string(),
                f: Box::new(solv_10),
            },
        ],
    });
}

////////////////////

fn benchmark_one_generate() -> Duration {
    // We want to know the time taken by the "generate" function
    time!(|| Grid::generate(None))
}

// We want to know the time taken by the "solve" function when 10 values are missing
fn solv_10() -> Duration {
    // First we generate a sudoku with 10 values missing (this step won't be timed)
    let mut grid = Grid::generate(None);
    grid.remove_random_values(10);

    // And now we actually time the "solve" function
    time!(|| grid.solve())
}

The code above will generate this benchmark report file at the location you provided

Benchmarking with 50 iterations

┌──────────┬──────────────────┬─────────────────┬─────────────┬─────────────────┐
│ Function │ Average          │ Slowest         │ Fastest     │ Std dev         │
├──────────┼──────────────────┼─────────────────┼─────────────┼─────────────────┤
│ generate │ 30ms 513µs 978ns │ 319ms 484µs 68+ │ 231µs 188ns │ 71ms 444µs 554+ │
│  solv10  │    34µs 567ns    │    83µs 18ns    │ 25µs 370ns  │   11µs 174n     │
└──────────┴──────────────────┴─────────────────┴─────────────┴─────────────────┘

generate

231µs 188ns - 6ms 287µs 746ns         │ ████████████████████████████████████ 64%
6ms 287µs 746ns - 12ms 344µs 304ns    │ █████ 10%
12ms 344µs 304ns - 18ms 400µs 862ns   │ ███ 6%
18ms 400µs 862ns - 24ms 457µs 420ns   │ ███ 6%
24ms 457µs 420ns - 30ms 513µs 978ns   │ 0%
─── Average 30ms 513µs 978ns          ├────────────────────
30ms 513µs 978ns - 88ms 308µs 118ns   │ ██ 4%
88ms 308µs 118ns - 146ms 102µs 258ns  │ 0%
146ms 102µs 258ns - 203ms 896µs 398ns │ ██ 4%
203ms 896µs 398ns - 261ms 690µs 538ns │ ██ 4%
261ms 690µs 538ns - 319ms 484µs 678ns │ █ 2%

solv10

25µs 370ns - 27µs 209ns │ ██████████████████████████████████████████████████ 32%
27µs 209ns - 29µs 48ns  │ █████████████████████████ 16%
29µs 48ns - 30µs 887ns  │ ███████████████ 10%
30µs 887ns - 32µs 726ns │ ██████████████████ 12%
32µs 726ns - 34µs 565ns │ 0%
─── Average 34µs 567ns  ├───────────────────────────
34µs 567ns - 44µs 257ns │ ███ 2%
44µs 257ns - 53µs 947ns │ ████████████████████████████████████████ 26%
53µs 947ns - 63µs 637ns │ 0%
63µs 637ns - 73µs 327ns │ 0%
73µs 327ns - 83µs 17ns  │ ███ 2%

Git hooks

Git hooks are handled with rusty-hook, to enable them after a fresh install, run cargo build

Tasks

Using CLI-Manager for task handling.

Dependencies

~5–15MB
~209K SLoC