-
Couldn't load subscription status.
- Fork 219
Description
We currently use criterion for benchmarking. The main limitation of criterion is that only a crate's public API can be tested.
In contrast, the standard benchmark harness (provided by the unstable test crate) allows you to mark any function with #[bench] (as you would a #[test]) - allowing you to benchmark internal functions. I believe this would be so valuable that it would outweigh the cons of using test. While working on #247, we were interested in knowing the specific timing of internal functions (e.g. here). I ended up manually inserting timing statements in the code, running the right test, and inspecting the output. IMO, this shows how limiting using criterion really is.
Note that criterion has a feature to allow benchmarking internal functions similar to #[bench], which depends on the custom_test_framework nightly feature . However, the tracking issue for custom_test_framework has been closed due to inactivity. So I personally would stay away from it if/until that changes.
Pros of using test over criterion
- Ability to benchmark internal functions
Cons of using test over criterion
- Less sophisticated reporting
- e.g.
criteriongives you the performance increase over the last run of the benchmark
- e.g.
- No generated html reports
- Probably less reliable
- e.g.
criterionpre-populates the cache before running a benchmark (not sure whether or nottestdoes that too, but at least it's not advertised in the benchmark output)
- e.g.
testis still unstable
Summary
Although there are more cons than pros, I believe the ability to benchmark internal functions far outweighs any of the cons (as explained earlier). We can deal with the dependency on nightly by adding a "benchmarking" feature, which controls the use of nightly.
#![cfg_attr(feature = "benchmarking", feature(test))]
#[cfg(feature = "benchmarking")]
extern crate test;
fn internal_function() { ... }
#[cfg(test)]
#[cfg(feature = "benchmarking")]
mod bench {
use super::*;
use test::Bencher;
#[bench]
fn bench_internal_function(b: &mut Bencher) {
b.iter(|| internal_function()));
}
}$ cargo +nightly bench --features=benchmarking bench_internal_function