【问题标题】:Know if CPU supports nanoseconds知道 CPU 是否支持纳秒
【发布时间】:2020-07-03 19:44:05
【问题描述】:

我正在尝试在 Visual Studio 中使用 C++ 获得以纳秒为单位的经过时间。我做了一些测试,结果总是以 00 结尾。这是否意味着我的处理器(Ryzen 7-1800X)不支持 ~1 纳秒的分辨率,但只支持 ~100ns?我可以以某种方式启用它吗?

auto start = std::chrono::high_resolution_clock::now();    
for (int i = 0; i < 10; i++) {
    //stuff
    auto elapsed = std::chrono::high_resolution_clock::now() - start;
    long long nanoseconds = std::chrono::duration_cast<std::chrono::nanoseconds>(elapsed).count();
    std::cout << "\n" << nanoseconds << "\n";
}

【问题讨论】:

  • 你能显示一些代码吗?您是否为此使用 std::chrono 命名空间?
  • 你去吧,是的,我正在使用 chrono @JasperKent
  • 那么它肯定意味着你的处理器不支持纳秒,所以关于你是否可以启用它实际上是一个处理器问题,而不是一个 C++ 问题。可能值得将处理器添加为问题的标签。
  • 如果您使用的是 Windows 的高分辨率计时器,那么 (IIRC) 100 ns 是 that 的粒度 - 它不依赖于 CPU 的类型。
  • 好的,谢谢@AdrianMole

标签: c++ windows performance time cpu


【解决方案1】:

在 MSVC 2015+ 中,std::chrono::high_resolution_clock 基于 QueryPerformanceCounter,其分辨率为 100ns。

在 Windows 上,QueryPerformanceCounter 是最快的用户态计时器。 如果您想要更高的分辨率,您可以尝试返回 CPU 周期计数器的 RDTSC 指令 (__rdtsc)。但要正确使用是very tricky one,不推荐。

在 Windows 上,您似乎几乎坚持使用 100ns 分辨率。请记住,在 Windows 世界中 100ns 是很短的时间 - 它大约等于 300 条指令。只需调用QueryPerformanceCounter 就需要大约 1000 条指令。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-02-20
    • 2018-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-15
    • 2015-04-07
    相关资源
    最近更新 更多