6 个版本
0.1.5 | 2018年9月22日 |
---|---|
0.1.4 | 2018年9月21日 |
#741 在 硬件支持
每月 28 次下载
15KB
175 行
x86
/x86_64
基于 time-stamp-counter (TSC) 的定时器
tsc-timer
crate master
分支的 API 文档
本库提供基于时间戳计数器(TSC)的定时器,用于微基准测试
// The function we want to time:
pub fn fibonacci(n: u64) -> u64 {
match n {
0 | 1 => 1,
n => fibonacci(n - 1) + fibonacci(n - 2),
}
}
// Non-invariant TSCs might produce unreliable results:
assert!(has_invariant_tsc(), "The TSC is not invariant!");
let (duration, result)
= Duration::span(|| black_box(fibonacci(black_box(8))));
assert_eq!(result, 34);
println!("Reference cycle count: {} cycles.",
duration.cycles());
// On my machine prints:
// "Reference cycle count: 951 cycles."
注意
-
由于 TSC 运行频率不同于 CPU 时钟频率,因此这里报告的周期是“参考周期”,而不是实际的 CPU 时钟周期。
-
如果 TSC 不是 不变的(Nehalem及以后),由于超频、速度步进、电源管理等原因,测量可能不准确。
-
将“参考周期”转换为时间(例如,纳秒)通常无法在用户空间中可靠地完成。
-
在计时之前可能需要禁用抢占和硬中断,以进一步提高测量的准确性(参见 如何在 Intel® IA-32 和 IA-64 指令集架构上基准测试代码执行时间)。
参考资料
许可证
本项目根据您的选择受以下任一许可证的约束:
。
贡献
我们欢迎所有想要贡献的人。
本项目对任何形式的贡献(问题、pull 请求等)都必须遵守 Rust 的 行为准则。
除非您明确表示,否则任何有意提交给 tsc-timer
的贡献,根据 Apache-2.0 许可证定义,应作为上述双重许可,不附加任何额外条款或条件。