divan-macros
Macros for Divan, a statistically-comfy benchmarking library.
0.1.21
12M downloads/mo
#2860 most downloaded on crates.io
nvzqz/divan
What this package is like to depend on
Last release 1 years ago
10 Apr 2025
Ships unpredictably
gaps range from 9 days to 9 months
Nearly every release is documented
notes for 22 of 23 stable releases
Nothing withdrawn
no release was ever pulled
3 years old
23 releases · first in 2023
0 releases in the last 12 months
see the full history below
Release timeline
23 releases · Jun 2023 to Apr 2025Releases
latest 23-
0.1.2110 Apr 2025Release notes
Open source →Fixed
Divan::skip_exactbehaved incorrectly inv0.1.19.
Changed
- Improved handling of internal code around filters and those responsible for sacking the people who have just been sacked have been sacked.
-
0.1.2010 Apr 2025Release notes
Open source →Fixed
Divan::skip_regexaccidentally droppedregex_lite::Regexand behaved incorrectly inv0.1.19.
-
0.1.1910 Apr 2025Release notes
Open source →Fixed
- [
cargo-nextest] no longer skips benchmarks with argument parameters ([#75]).
Changed
- Organized positive and negative filters into a split buffer.
- [
-
0.1.1805 Apr 2025Release notes
Open source →Added
-
Support for [
cargo-nextest] running benchmarks as tests. -
[
prelude] module for simplifying imports of [#[bench]][bench_attr], [#[bench_group]][bench_group_attr], [black_box], [black_box_drop], [AllocProfiler], [Bencher], and [Divan]. -
Support
wasiandemscriptentargets.
-
-
0.1.1705 Dec 2024Release notes
Open source →Changed
-
Set [MSRV] to 1.80 for [
LazyLock] and newsize_ofprelude import. -
Reduced thread pool memory usage by many kilobytes by using rendezvous channels instead of array-based channels.
-
-
0.1.1625 Nov 2024Release notes
Open source →Added
-
Thread pool for reusing threads across multi-threaded benchmarks. The result is that when running Divan benchmarks under a sampling profiler, the profiler's output will be cleaner and easier to understand. ([#37])
-
Track the maximum number of allocations during a benchmark.
Changed
-
Make private
Arg::gettrait method not takeself, so that text editors don't recommend using it. ([#59]) -
Cache
BenchOptionsusingLazyLockinstead ofOnceLock, saving space and simplifying the implementation.
-
-
0.1.1501 Nov 2024Release notes
Open source →Added
-
[
CyclesCount] counter to display cycle throughput as Hertz. -
Track the maximum number of bytes allocated during a benchmark.
Removed
- Remove
has_cpuidpolyfill due to it no longer being planned for Rust, since CPUID is assumed to be available on all old x86 Rust targets.
Fixed
-
List generic benchmark type parameter
A<4>beforeA<32>. ([#64]) -
Improve precision by using
f64when calculating allocation count and sizes for the median samples. -
Multi-thread allocation counting in
sum_alloc_tallieson macOS was loading a null pointer instead of the pointer initialized bysync_threads.
Changed
-
Sort all output benchmark names naturally instead of lexicographically.
-
Internally reuse [
&[&str]slice][slice] for [args] names. -
Subtract overhead of [
AllocProfiler] from timings. Now that Divan also tracks the maximum bytes allocated, the overhead was apparent in timings. -
Simplify
ThreadAllocInfo::clear. -
Move measured loop overhead from
SharedContextto globalOnceLock. -
Macros no longer rely on
stdbeing re-exported by Divan. Instead they use::stdor::coreto greatly simplify code. Although this is technically a breaking change, it is extremely unlikely to doextern crate std as x.
-
-
0.1.1417 Feb 2024Release notes
Open source →Fixed
- Set correct field in [
Divan::max_time]. (#45)
Changed
-
Improve [
args] documentation by relating it to using [Bencher]. -
Define [
BytesCount::of_iter] in terms of [BytesCount::of_many].
- Set correct field in [
-
0.1.1310 Feb 2024 -
0.1.1210 Feb 2024Release notes
Open source →Added
-
Display [
args] option values with [Debug] instead if [ToString] is not implemented.This makes it simple to use enums with derived [
Debug]:#[derive(Debug)] enum Arg { A, B } #[divan::bench(args = [Arg::A, Arg::B])] fn bench_args(arg: &Arg) { ... } -
Documentation of when to use [
black_box] in benchmarks.
-
-
0.1.1121 Jan 2024 -
0.1.1021 Jan 2024 -
0.1.921 Jan 2024Release notes
Open source →Added
-
[
args] option for providing runtime arguments to benchmarks:#[divan::bench(args = [1, 2, 3])] fn args_list(arg: usize) { ... } #[divan::bench(args = 1..=3)] fn args_range(arg: usize) { ... } const ARGS: &[usize] = [1, 2, 3]; #[divan::bench(args = ARGS)] fn args_const(arg: usize) { ... }This option may be preferred over the similar [
consts] option because:- It is compatible with more types, only requiring that the argument type
implements [
Any], [Copy], [Send], [Sync], and [ToString]. [Copy] is not needed if the argument is used through a reference. - It does not increase compile times, unlike [
consts] which needs to generate new code for each constant used.
- It is compatible with more types, only requiring that the argument type
implements [
-
-
0.1.819 Dec 2023Release notes
Open source →Changed
-
Reduce [
AllocProfiler] footprint from 6-10ns to 1-2ns:-
Thread-local values are now exclusively owned by their threads and are no longer kept in a global list. This enables some optimizations:
-
Performing faster unsynchronized arithmetic.
-
Removing one level of pointer indirection by storing the thread-local value entirely inline in [
thread_local!], rather than storing a pointer to a globally-shared instance. -
Compiler emits SIMD arithmetic for x86_64 using
paddq.
-
-
Improved thread-local lookup on x86_64 macOS by using a static lookup key instead of a dynamic key from [
pthread_key_create]. Key 11 is used because it is reserved for Windows.The
dyn_thread_localcrate feature disables this optimization. This is recommended if your code or another dependency uses the same static key.
-
Fixed
- Remove unused allocations if [
AllocProfiler] is not active as the global allocator.
-
-
0.1.713 Dec 2023Release notes
Open source →Changed
-
Improve [
AllocProfiler] implementation documentation. -
Limit [
AllocProfiler] mean count outputs to 4 significant digits to not be very wide and for consistency with other outputs.
-
-
0.1.613 Dec 2023Release notes
Open source →Added
- [
AllocProfiler] allocator that tracks allocation counts and sizes during benchmarks.
- [
-
0.1.505 Dec 2023Release notes
Open source →Added
-
[
black_box_drop] convenience function for [black_box] + [drop]. This is useful when benchmarking a lazy [Iterator] to completion withfor_each:#[divan::bench] fn parse_iter() { let input: &str = // ... Parser::new(input) .for_each(divan::black_box_drop); }
-
-
0.1.402 Dec 2023Release notes
Open source →Added
-
Fromimplementations for counters on references tou8–u64andusize, such asFrom<&u64>andFrom<&&u64>. This allows for doing:bencher .with_inputs(|| { ... }) .input_counter(ItemsCount::from) .bench_values(|n| { ... }); -
Bencher::count_inputs_as<C>method to convert inputs to aCounter:bencher .with_inputs(|| -> usize { // ... }) .count_inputs_as::<ItemsCount>() .bench_values(|n| -> Vec<usize> { (0..n).collect() });
-
-
0.1.321 Nov 2023Release notes
Open source →Added
-
Convenience shorthand options for
#[divan::bench]and#[divan::bench_group]counters:bytes_countforcounter = BytesCount::from(n)chars_countforcounter = CharsCount::from(n)items_countforcounter = ItemsCount::from(n)
-
Support for NetBSD, DragonFly BSD, and Haiku OS by using pre-
main. -
Set global thread counts using:
Divan::threads--threads A B C...CLI argDIVAN_THREADS=A,B,Cenv var
The following example will benchmark across 2, 4, and [available parallelism] thread counts:
DIVAN_THREADS=0,2,4 cargo bench -q -p examples --bench atomic -
Set global
Counters at runtime using:Divan::counterDivan::items_countDivan::bytes_countDivan::chars_count--items-count NCLI arg--bytes-count NCLI arg--chars-count NCLI argDIVAN_ITEMS_COUNT=Nenv varDIVAN_BYTES_COUNT=Nenv varDIVAN_CHARS_COUNT=Nenv var
-
From<C>forItemsCount,BytesCount, andCharsCountwhereCisu8–u64orusize(viaCountUIntinternally). This provides an alternative to thenewconstructor. -
BytesCount::of_manymethod similar toBytesCount::of, but with a parameter by which to multiply the size of the type. -
BytesCount::u64,BytesCount::f64, and similar methods based onBytesCount::of_many.
Removed
-
[
black_box] inside benchmark loop when deferring [Drop] of outputs. This is now done after the loop. -
linkmedependency in favor of pre-mainto register benchmarks and benchmark groups. This is generally be more portable and reliable.
Changed
- Now calling [
black_box] at the end of the benchmark loop when deferring use of inputs or [Drop] of outputs.
-
-
0.1.228 Oct 2023Release notes
Open source →Fixed
- Multi-threaded benchmarks being spread across CPUs, instead of pinning the main thread to CPU 0 and having all threads inherit the main thread's affinity.
-
0.1.125 Oct 2023Release notes
Open source →Fixed
- Fix using LLD as linker for Linux by using the same pre-
mainapproach as Windows.
- Fix using LLD as linker for Linux by using the same pre-
-
0.1.004 Oct 2023Release notes
Open source →Initial release. See blog post.
<!-- Stable --> [
AllocProfiler]: https://docs.rs/divan/latest/divan/struct.AllocProfiler.html [args]: https://docs.rs/divan/latest/divan/attr.bench.html#args [Bencher]: https://docs.rs/divan/latest/divan/struct.Bencher.html [black_box_drop]: https://docs.rs/divan/latest/divan/fn.black_box_drop.html [black_box]: https://docs.rs/divan/latest/divan/fn.black_box.html [consts]: https://docs.rs/divan/latest/divan/attr.bench.html#consts [Divan::max_time]: https://docs.rs/divan/latest/divan/struct.Divan.html#method.max_time [Divan]: https://docs.rs/divan/latest/divan/struct.Divan.html [prelude]: https://docs.rs/divan/latest/divan/prelude/index.html [bench_attr]: https://docs.rs/divan/latest/divan/attr.bench.html [bench_group_attr]: https://docs.rs/divan/latest/divan/attr.bench_group.html<!-- 0.1 --> [
BytesCount::of_iter]: https://docs.rs/divan/0.1/divan/counter/struct.BytesCount.html#method.of_iter [BytesCount::of_many]: https://docs.rs/divan/0.1/divan/counter/struct.BytesCount.html#method.of_many [CyclesCount]: https://docs.rs/divan/0.1/divan/counter/struct.CyclesCount.html -
0.0.030 Jun 2023Nothing published for this version