测量Windows C++中的时间,毫秒或微秒

10

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

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

我在这篇论文中找到了一个名为gettimeofday(日历时间)的函数: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-snippet-in-c


你是使用带有CLR支持的C++还是Win32?这个问题缺乏对问题的普遍理解。 - Evan L
我认为这个问题没有被很好地提出,但是它是可以挽救的。为了公正起见,我给它点赞,有人可以帮忙编辑一下吗? - Russia Must Remove Putin
3个回答

31

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

#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";
}

需要翻译的内容:

需要记住的一件事是使用 <chrono> 可以实现类型安全、通用的计时代码,但要获得这个好处,你需要以不同于使用int等类型存储持续时间和时间点的愚蠢、类型不安全的计时库的方式使用它。下面的答案解释了一些特定的使用场景,以及使用未打过类型标记库和使用chrono的最佳实践之间的区别: https://dev59.com/gG7Xa4cB1Zd3GeqPn0Nw#15839862


Visual Studio标准库实现的维护者 表明 通过使用QueryPerformanceCounter()在VS2015中已经修复了high_resolution_clock的低分辨率问题。


2
请注意!某些版本的Visual Studio提供的chrono头文件存在错误。请参见此处QueryPerformanceCounter是在Win32下获取高分辨率计时的一种方法。 - Rook
1
我可以确认,VS 2015现在使用QueryPerformanceCounter作为high_resolution_clock。(较旧的VS版本只是对所有时钟使用GetSystemTime。) - Paul Groke
fib()函数中的return语句缺少分号。 - Chief A
为了完整性:自VS2015以来,high_resolution_clocksteady_clock的别名(在VS2012之前它是system_clock的别名),而steady_clock使用QueryPerformanceCounter和QueryPerformanceFrequency。因此,从VS2015开始,high_resolution_clock将具有最高分辨率。但是,直接使用std::chrono::steady_clock或std::chrono::system_clock而不是std::chrono::high_resolution_clock(参考)。 - starriet

4
你需要使用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;

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


2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接