diff options
| author | steven-vd <steven@vandorp.lu> | 2026-08-16 15:00:32 +0200 |
|---|---|---|
| committer | steven-vd <steven@vandorp.lu> | 2026-08-17 09:31:42 +0200 |
| commit | ee081ca70322cd01d0642fdb1860e6bfbfb48e85 (patch) | |
| tree | 295fdba93b08b24562c6d49e971bbf3425eac50c /benchmarks/harness.rs | |
Diffstat (limited to 'benchmarks/harness.rs')
| -rw-r--r-- | benchmarks/harness.rs | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/benchmarks/harness.rs b/benchmarks/harness.rs new file mode 100644 index 0000000..c0f90f0 --- /dev/null +++ b/benchmarks/harness.rs @@ -0,0 +1,59 @@ +use std::{ + fs, + fmt::Write, + hint::black_box, + time::{Duration, Instant}, +}; + +fn read_energy_uj() -> u64 { + fs::read_to_string("/sys/class/powercap/intel-rapl/intel-rapl:0/energy_uj") + .map(|s| s.trim().parse().unwrap_or(0)) + .unwrap_or_else(|e| { + eprintln!("Failed to open energy counter (Are you running with sudo?): {e}"); + 0 + }) +} + +pub fn bench(name: String, f: fn(&[u8]) -> usize, buffer: &[u8], out: &mut String) { + let mut budget: isize = 5_000_000_000; + + let mut best = Duration::MAX; + let mut best_energy = u64::MAX; + + writeln!(out, " <benchmark name=\"{}\">", name).unwrap(); + + let res = f(buffer); + + while budget > 0 { + let energy_start = read_energy_uj(); + let start = Instant::now(); + let res = f(buffer); + let elapsed = start.elapsed(); + best = best.min(elapsed); + best_energy = best_energy.min(read_energy_uj() - energy_start); + budget -= elapsed.as_nanos() as isize; + black_box(res); + } + + writeln!(out, + "\x20 <res>{}</res>\n\ + \x20 <time unit=\"ns\">{}</time>\n\ + \x20 <throughput unit=\"MiB/s\">{}</throughput>", + res, + best.as_nanos(), + (buffer.len() as f64 / (1024.0 * 1024.0)) / best.as_secs_f64(), + ).unwrap(); + + if best_energy != 0 { + writeln!(out, + "\x20 <energy-consumption unit=\"J/GiB\">{}</energy-consumption>", + ((best_energy as f64) / (1000.0 * 1000.0)) / (buffer.len() as f64 / (1024.0 * 1024.0 * 1024.0)), + ).unwrap(); + } + writeln!(out, + "\x20 </benchmark>", + ).unwrap(); + +} + + |
