9 releases

0.2.6 Dec 19, 2021
0.2.5 Dec 18, 2021
0.1.1 Dec 16, 2021

#916 in Development tools

Download history 15/week @ 2024-02-19 11/week @ 2024-02-26 4/week @ 2024-03-04 4/week @ 2024-03-11 1/week @ 2024-03-18 82/week @ 2024-04-01

83 downloads per month
Used in node-workers

MIT license

200 lines


Crates.io documentation


  • Focus on one-shot benchmark
  • RAII-style
  • Statistics (Average, Median, 95% and 99% percentile)
  • Colored output
  • Tagging
  • Nesting


I guess there are two types of benchmarks.

One is a benchmark of a small and fast function in which we want the statistics from a million of iterations. For this type of benchmark, Criterion.rs is a good fit.

Another type is what I call one-shot benchmark.

You may have wanted to write a benchmark program like this.

let mut db = DB::new();

let t = Instant::now();
println!("write: {:?}", t.elapsed());

let t = Instant::now();
println!("read: {:?}", t.elapsed());

According to Criterion.rs #531, this type of benchmark is infeasible with Criterion.rs because Criterion is focusing on the first type.

That's why I started to create benchman.

RAII-style measurement

RAII is a good technique to manage resource access. My idea behind designing benchman is that stopwatch is like a resource because it is like a producer of a benchmark result that sends the result to the single central consumer and there is a strict rule that stopwatch shouldn't send the result twice.

With this idea, the library is designed like this.

let stopwatch = benchman.get_stopwatch("some_tag");

// or

    let _sw = benchman.get_stopwatch("some_tag");

When the stopwatch is dropped, the measurement result is sent to the central database.


スクリーンショット 2021-12-18 12 42 40


Akira Hayakawa (@akiradeveloper)


~68K SLoC