#timestamp #counter #stamp #measurement #tsc #time

nightly no-std tsc-time

基于时间戳计数器(TSC)的定时器

1 个不稳定版本

0.1.0 2018年9月21日

#1272 in 硬件支持

MIT/Apache

15KB
173

x86/x86_64 基于时间戳计数器(TSC)的定时器

Travis-CI Status Appveyor Status Latest Version docs

tscmaster 分支的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指令集架构上基准测试代码执行时间)。

参考资料

许可证

本项目采用Apache License, Version 2.0或MIT License。

任选其一。

贡献

我们欢迎所有希望贡献的人。

对本项目的贡献(问题、pull请求等)必须遵守Rust的行为准则

除非您明确声明,否则根据Apache-2.0许可证定义的任何有意提交给tsc的贡献,将如上双许可,不附加任何额外条款或条件。

无运行时依赖