【问题标题】:Nanosecond Accuracy For Timing In C++ [duplicate]C ++中计时的纳秒精度[重复]
【发布时间】:2013-07-10 10:10:45
【问题描述】:

在 C++ 中有没有办法获得纳秒精度?相当于 Java 中的纳秒计时器 (System.nanotime)。

【问题讨论】:

标签: c++ milliseconds delta nanotime


【解决方案1】:

如果您使用的是 Windows/Visual Studio(可能未实现 std::chrono,至少在 VS2010 中未实现),您可以使用 QueryPerformanceCounterQueryPerformanceFrequency 来获得最高精度的计时任务:

LARGE_INTEGER freq, counter1, counter2;
QueryPerformanceFrequency(&freq);
QueryPerformanceCounter(&counter1);
task();
QueryPerformanceCounter(&counter2);
long double elapsed = (long double) (counter2.QuadPart - counter1.QuadPart) / (long double) freq.QuadPart;

【讨论】:

  • 有很多问题 - 内核之间常见的不同步(可能是几秒钟,MS 很容易将责任归咎于 HAL/BIOS 编写器)、CPU 节能模式启动后的漂移等。
  • 我记得不同步只发生在某些双核 AMD 上,如果你只是用它来测量小间隔的性能,那么省电并不是一个大问题。它仍然是最精确的“计时器”,尽管我猜作者应该指定他想要它的用途。
  • 无论您回想起什么声明,都可能是在问题相对较新时编写的,但它仍然存在并且在现代硬件上是最新的,包括我正在使用的 Intel Core i7。大约一年前,我编写了一个库来检测和补偿启动时跨核漂移,并在当时测量了这台 PC 上的显着漂移。我在上一家公司的现代机器数量上测量了类似的漂移(有时是几秒)——我怀疑那里也有 Xeons,但记不清了。
【解决方案2】:

在 C++11 实现中,您应该能够使用 std::chrono

在 linux 和其他几个 Unix 风格中,clock_gettime 还可以为您提供纳秒精度的时间。在 Windows 中,GetSystemTime 提供毫秒精度。

但是,就像他们所有的同类一样,它取决于实际的操作系统/库/等,如果您实际获得纳秒、微秒、毫秒或其他一些精度的实现 - 时间通常以 nanoseconds 显示,但这并不不一定会给你很高的准确度——它可能会每“滴答”跳跃 1000000 或 10000 或 14718 ns。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-27
    • 1970-01-01
    • 1970-01-01
    • 2011-02-23
    • 2017-04-22
    • 2023-03-17
    • 2019-07-13
    • 2020-02-02
    相关资源
    最近更新 更多