7 个不稳定版本
0.6.1 | 2024 年 8 月 13 日 |
---|---|
0.6.0 | 2023 年 11 月 25 日 |
0.5.0 | 2023 年 5 月 28 日 |
0.4.0 | 2022 年 12 月 16 日 |
0.1.1 | 2019 年 9 月 27 日 |
#30 in 分析
6,601 每月下载量
在 不到 25 crates 中使用
11KB
120 行
criterion-cycles-per-byte
CyclesPerByte
使用 CPU 读取时间戳计数指令来衡量滴答。
循环测量指令
架构 | 指令 |
---|---|
x86 | rdtsc / rdpru |
x86_64 | rdtsc / rdpru |
aarch64 (运行 GNU/Linux 内核) | pmccntr |
loongarch64 | rdtime.d |
RDPRU 指令仅在 Zen 2 以上的 AMD CPU 上可用,并且默认不使用。要启用它,请使用 rdpru
配置标志,例如通过使用 RUSTFLAGS="--cfg rdpru"
。请注意,这个 crate 不在运行时检查指令的可用性,这可能导致基准执行期间的“非法指令”异常。
启用 rdpru
后,还强烈建议将基准固定在一个核心上,例如通过使用 taskset
: RUSTFLAGS="--cfg rdpru" taskset --cpu-list 0 cargo bench
。否则,该 crate 可能会因为基准线程在 CPU 核心之间迁移而产生极其错误的测量结果。
警告:x86
除非启用 rdpru
,否则此 crate 测量的是时钟滴答而不是循环。除非你计算出滴答与循环的比例并采取措施确保该比例保持一致,否则它不会在现代机器上提供准确的结果。
警告:aarch64
如果您打算在运行 GNU/Linux 内核的 aarch64
目标上使用这个库,我建议您阅读 src/lib.rs#L61-L68。
示例
use criterion::{criterion_group, criterion_main, BenchmarkId, Criterion};
use criterion_cycles_per_byte::CyclesPerByte;
fn bench(c: &mut Criterion<CyclesPerByte>) {
let mut group = c.benchmark_group("fibonacci");
for i in 0..20 {
group.bench_function(BenchmarkId::new("slow", i), |b| b.iter(|| fibonacci_slow(i)));
group.bench_function(BenchmarkId::new("fast", i), |b| b.iter(|| fibonacci_fast(i)));
}
group.finish()
}
criterion_group!(
name = my_bench;
config = Criterion::default().with_measurement(CyclesPerByte);
targets = bench
);
criterion_main!(my_bench);
维护状态
我不是原始作者,但我维护这个 crate,因为它仍然在一些地方被使用。我计划根据需要更新版本和修复错误,但不会添加功能或尝试解决(可能难以解决的)测量方法的问题。
兼容性
Criterion 版本 | 每字节周期版本 |
---|---|
0.5 | 0.6 |
0.4 | 0.4 |
依赖项
~8–19MB
~250K SLoC