1 unstable release
| 0.0.0-alpha0 | Dec 8, 2022 |
|---|
#9 in #cpu-cache
56KB
1.5K
SLoC
µbench
"micro bench", as in: microcontroller
what
This is a tiny crate that attempts to help you benchmark things running on microcontrollers.
This is not a particularly good crate. It:
- does not attempt to be statistically rigorous
- does not try to mitigate the effects of CPU caches/frequency scaling/OS context switches, etc. on benchmarks
- does not really provide machinery for host-side processing
- does not attempt to mimic the output of the
test::benchmodule - does not make use of the
defmtecosystem [^1] (in order to support boards that do not haveprobe-rssupport)
[^1]: Nothing precludes you from writing a Reporter that makes use of defmt machinery but this crate does not ship with one. The default reporter is naive, uses core::fmt, and is space inefficient.
µbench is very much intended to be a stopgap; it is my sincere hope that this crate will be obviated in the near future.
However, as of this writing, there seems to be a real dearth of solutions aimed at users who just want to: run some code on their device and get back cycle counts, without needing to spin up a debugger. Hence this crate.
The closest thing out there (that I am aware of) that serves this use case is liar which is, unfortunately, just a tiny bit too barebones when the std feature is disabled.
how does it work?
(overview of the traits:
Benchmarkwhich can be:fn, closure implingFnMut, custom impl withsetup+teardown- these take some
Inpdata by reference
- these take some
BenchmarkRunnerlets you actually run benchmarks; two kinds- single (constructible with
single)- exactly one
Benchmarkimpl
- exactly one
- suite (constructible with
suite)- zero or more
Benchmarkimpls that are all run on the same input data
- zero or more
- each of these also take some
impl IntoIterator<Item = T>as an input source whereT: Debug- this can be things like a range (
0..10), an array (["hey", "there"]), an iterator ((0..10).map(|x| 2u32.pow(x))), etc.
- this can be things like a range (
- single (constructible with
- to actually run the benchmarks you need:
- a
Metric- some way to actually measure the benchmarks; i.e. time, cycle counts
- a
Reporter- some way to report out the results of the benchmarking )
- a
usage
Dependencies
~0.2–1.2MB
~17K SLoC