【问题标题】:Measure time, milliseconds or microseconds for Windows C++ [duplicate]测量 Windows C++ 的时间、毫秒或微秒 [重复]
【发布时间】:2014-05-12 18:01:46
【问题描述】:

如何在 Windows C++ 中以毫秒或微秒为单位测量执行时间?

我发现许多方法一调用 time(NULL),但它仅以秒为单位测量时间,而秒 clock() (clock_t) 测量的是 CPU 时间,而不是实际时间。

我找到了本文提到的函数gettimeofday(Calendar time): dropbox.com/s/k0zv8pck7ydbakz/1_7-PDF_thesis_2.pdf

此函数适用于 Linux(以毫秒和微秒为单位计算时间)而非 Windows。

我为 Windows 找到了一个替代方案: dropbox.com/s/ofo99b166l7e2gf/gettimeofday.txt

这可能是相关的:stackoverflow.com/questions/1861294/how-to-calculate-execution-time-of-a-code-sn-p-in-c

【问题讨论】:

  • 您是否在使用支持 CLR 的 C++?还是Win32?这个问题缺乏对问题的一般理解。
  • 我认为这个问题问得不好,但可以挽救。为了公平起见 +1,有人可以帮忙编辑吗?

标签: c++ windows time measure


【解决方案1】:

您可以使用标准 C++ <chrono> library:

#include <iostream>
#include <chrono>

// long operation to time
long long fib(long long n) {
  if (n < 2) {
    return n;
  } else {
    return fib(n-1) + fib(n-2);
  }
}

int main() {
  auto start_time = std::chrono::high_resolution_clock::now();

  long long input = 32;
  long long result = fib(input);

  auto end_time = std::chrono::high_resolution_clock::now();
  auto time = end_time - start_time;

  std::cout << "result = " << result << '\n';
  std::cout << "fib(" << input << ") took " <<
    time/std::chrono::milliseconds(1) << "ms to run.\n";
}

要记住的一件事是,使用 &lt;chrono&gt; 可以启用类型安全的通用时序代码,但要获得该好处,您使用它的方式与使用存储持续时间和时间的愚蠢、类型不安全的时序库略有不同int 等类型的点。这里有一个答案,解释了一些特定的使用场景以及使用无类型库和使用 chrono 的最佳实践之间的区别:https://stackoverflow.com/a/15839862/365496


Visual Studio 标准库实现has indicated 的维护者,通过QueryPerformanceCounter() 的使用在VS2015 中修复了high_resolution_clock 的低分辨率。

【讨论】:

  • 请注意! Visual Studio 提供的 chrono 标头的某些版本中存在错误。请参阅hereQueryPerformanceCounter是Win32下获取高分辨率计时的一种方式。
  • 我可以确认 VS 2015 现在将 QueryPerformanceCounter 用于 high_resolution_clock。 (旧的 VS 版本只对所有时钟使用 GetSystemTime。)
  • fib() 中的 return 语句缺少分号
【解决方案2】:

您需要使用 QPC/QPF API 来计算执行时间。在调用QueryPerformanceCounter 之间调用您想要的代码,然后使用QueryPerformanceFrequency 将其从周期转换为微秒。

LARGE_INTEGER nStartTime;
LARGE_INTEGER nStopTime;
LARGE_INTEGER nElapsed;
LARGE_INTEGER nFrequency;

::QueryPerformanceFrequency(&nFrequency); 
::QueryPerformanceCounter(&nStartTime);

    SomethingToBeTimed();

::QueryPerformanceCounter(&nStopTime);
nElapsed.QuadPart = (nStopTime.QuadPart - nStartTime.QuadPart) * 1000000;
nElapsed.QuadPart /= nFrequency.QuadPart;

参考资料: http://msdn.microsoft.com/en-us/library/windows/desktop/dn553408(v=vs.85).aspx

【讨论】:

    【解决方案3】:

    您正在寻找QueryPerformanceCounter 和相关功能。

    【讨论】:

      猜你喜欢
      • 2011-12-26
      • 2012-02-12
      • 1970-01-01
      • 2021-09-30
      • 2015-06-25
      • 2013-03-09
      • 1970-01-01
      • 2019-08-01
      • 1970-01-01
      相关资源
      最近更新 更多