1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
//! Benchmark harness helpers.
//!
//! Supports two harnesses via separate feature flags:
//!
//! - **`bench`** — [divan] for wall-clock benchmarks (any platform)
//! - **`bench-gungraun`** — [gungraun] for instruction-count benchmarks
//! via Valgrind/Callgrind (Linux/Intel)
//!
//! # divan (wall-clock)
//!
//! ```no_run
//! use librebar::bench::divan;
//!
//! fn main() {
//! divan::main();
//! }
//!
//! #[divan::bench]
//! fn my_benchmark() { /* ... */ }
//! ```
//!
//! # gungraun (instruction-count)
//!
//! In a real benchmark crate these items live at the top level of a
//! `benches/*.rs` file. The `mod` wrapper below only exists so rustdoc
//! can name-resolve `sort_vec` inside [`gungraun::library_benchmark_group!`]
//! — rustdoc wraps each snippet in an implicit `fn main()`, which hides
//! top-level identifiers from the macro's expansion.
//!
//! ```no_run
//! mod example_bench {
//! use librebar::bench::gungraun;
//!
//! #[gungraun::library_benchmark]
//! #[bench::args(1000)]
//! fn sort_vec(n: usize) {
//! let mut v: Vec<u32> = (0..n as u32).rev().collect();
//! v.sort();
//! }
//!
//! gungraun::library_benchmark_group!(name = sorting; benchmarks = sort_vec);
//! gungraun::main!(library_benchmark_groups = sorting);
//! }
//! ```
pub use divan;
pub use gungraun;
/// Configuration for wall-clock benchmark runs (divan).