c++代码执行定时器返回0,需要以毫秒为单位输出

Posted

技术标签:

【中文标题】c++代码执行定时器返回0,需要以毫秒为单位输出【英文标题】:c++ code execution timer returning 0, need output in milliseconds 【发布时间】:2016-08-08 21:37:28 【问题描述】:

我试图弄清楚如何计算我的程序的一部分的执行时间,但是当我使用下面的代码时,我得到的只是 0。我知道这不可能。我正在计时的代码递归地实现了一个大型整数数组的归并排序。如何获得以毫秒为单位执行程序所需的时间?

//opening input file and storing contents into array
index = inputFileFunction(inputArray);

clock_t time = clock();//start the clock

//this is what needs to be timed
newRecursive.mergeSort(inputArray, 0, index - 1);

//getting the difference        
time = clock() - time;

double ms = double(time) / CLOCKS_PER_SEC * 1000;

std::cout << "\nTime took to execute: " << std::setprecision(9) << ms << std::endl;

【问题讨论】:

clock() 只有秒精度(在 32 位系统上它可以每 36 分钟换行一次),所以如果 mergeSort() 运行时间不到 1 秒,这可以解释为什么你会得到结果0。对于您正在尝试的内容,您需要使用更高精度的计时器,例如来自clock_gettime(),甚至是特定于操作系统的 API。 【参考方案1】:

您可以在 C++11 中使用 chrono 库。修改代码的方法如下:

#include <chrono>
//...
auto start = std::chrono::steady_clock::now();
// do whatever you're timing
auto end = std::chrono::steady_clock::now();
auto durationMS = std::chrono::duration_cast<std::chrono::microseconds>(end - start);
std::cout << "\n Time took " << durationMS.count() << " ms" << std::endl;

【讨论】:

抱歉,在 cout 的最后一行你需要 durationMS.count() 而不是 durationMS 感谢您的帮助。当我实现你的代码时,它仍然给我一个输出 0 :( 你认为它的运行时间少于 1 微秒吗?也许尝试nanoseconds 而不是duration_cast 中的微秒? @grigor 我认为你是对的。我增加了递归归并排序必须经过的数据的大小,所以它需要更长的时间,最终出现了 0 以外的东西。有什么小于纳秒的吗? 很少有可以解析到纳秒的时钟。 C++ 允许您指定纳秒,因为为什么不呢?几乎没有成本,而且您以后不必重写标准的那部分。【参考方案2】:

如果您在 OSX 上开发,来自 Apple 的 blog post 可能会很有用。它包含的代码 sn-ps 应该可以为您提供所需的时间分辨率。

【讨论】:

以上是关于c++代码执行定时器返回0,需要以毫秒为单位输出的主要内容,如果未能解决你的问题,请参考以下文章

如何在 c++ 中以毫秒为单位获得系统启动时间?

如何以毫秒为单位获取当前时间?

以毫秒为单位偏移当前系统时间到时区 GMT

2个定时器之间的差异

如何以毫秒为单位准确记录方法的执行时间?

以毫秒为单位的 Bash 睡眠