1 个不稳定版本
0.1.0 | 2018年9月21日 |
---|
#1272 in 硬件支持
15KB
173 行
x86
/x86_64
基于时间戳计数器(TSC)的定时器
本库提供了一个基于时间戳计数器(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指令集架构上基准测试代码执行时间)。
参考资料
许可证
本项目采用Apache License, Version 2.0或MIT License。
任选其一。
贡献
我们欢迎所有希望贡献的人。
对本项目的贡献(问题、pull请求等)必须遵守Rust的行为准则。
除非您明确声明,否则根据Apache-2.0许可证定义的任何有意提交给tsc
的贡献,将如上双许可,不附加任何额外条款或条件。