如何在Qt中测量函数运行时间?

5

我正在调用Qt中的argon2 - 一种内存密集型哈希函数,并测量其运行时间:

...
QTime start = QTime::currentTime();
// call hashing function
QTime finish = QTime::currentTime();
time = start.msecsTo(finish) / 1000.0;
...

在argon2库的测试用例中,时间以另一种方式进行测量:
...
clock_t start = clock();
// call hashing function
clock_t finish = clock();
time = ((double)finish - start) / CLOCKS_PER_SEC;
...

我按照他们测试用例中的方式调用函数,但是我得到了一个两倍大的数字(速度两倍慢)。为什么?如何在Qt中测量函数运行时间?clock()实际上测量什么? 环境:virtualBox,Ubuntu14.04 64位,Qt5.2.1,Qt Creator 3.0.1。

1
可能是c++ / Qt-计算时间的重复问题。 - PsiX
2
不知道这个 "argon2" 是什么,但它看起来并不太合适... 正确的方法是使用 QElapsedTimer,它非常容易使用,并且在给定平台的情况下尽可能准确。 - dtech
@PsiX编辑。我想知道时间差异的原因。 - Bobur
@Bobur 好的,那么为什么你接受了一个没有回答那个问题的答案呢? - PsiX
@PsiX建议我使用QElapsedTimer,另一个人则建议不要使用clock()。两者都解释了他们的观点。现在我知道该怎么做了。我想接受两个答案,但我不能。但我想知道为什么你会问这个问题?这有什么问题吗? - Bobur
@Bobur,你应该只接受那些真正回答了你问题的答案。或者更新你的问题,使其更符合你所接受的答案。 “但是我得到了一个两倍大的数字(两倍慢)。为什么?”你有答案吗? 你已经接受了一个与你的第二个问题(“如何在Qt中测量函数运行时间?”)重复的答案。 你应该澄清你的问题。 - PsiX
2个回答

22

您还可以尝试使用QElapsedTimer:

QElapsedTimer timer;
timer.start();

slowOperation1();

qDebug() << "The slow operation took" << timer.elapsed() << "milliseconds";
qDebug() << "The slow operation took" << timer.nsecsElapsed() << "nanoseconds";

QElapsedTimer 文档


1
clock()不适用于测量函数执行时间的精确性。它只返回整个程序在CPU上运行时的时钟数,不计算阻塞的IO操作或睡眠时间。它只计算程序在CPU上(处理)运行的时钟数。如果您的代码中使用了sleep,您将失去CPU,这段时间不会被计算在clock()中。您必须使用time()、gettimeofday()或更精确的rdtsc汇编指令。
看一下这些问题: clock() 精度 为什么CLOCKS_PER_SEC不是实际每秒钟的时钟数? 在Qt源代码中,您会看到Qt在Unix下使用gettimeofday来实现QTime::currentTime()https://github.com/radekp/qt/blob/master/src/corelib/tools/qdatetime.cpp:第1854行

这大部分是不正确的。很久以前,当CPU以固定频率运行时是正确的。而今天,CPU不再以固定频率运行,并且clock()函数实现方式不同,如果你可以接受毫秒级的精度,它是相当准确的。 - dtech
@ddriver C 语言中的 clock 函数“返回自程序开始以来,与程序调用相关的实现定义时代的最佳近似处理器时间使用情况。”https://dev59.com/u2kw5IYBdhLWcg3wdKbD#9871772 - e.jahandar
如果我在1秒钟内运行两个函数,第一个是CPU密集型的(进行大量计算),另一个是内存绑定函数(进行大量内存块读写),并使用clock()测量它们的时间,您的意思是即使实际运行时间相同,CPU密集型函数的clock()时间也会比第二个函数长吗? - Bobur
@e.jahandar 另外一件事,您建议我使用"time()或gettimeofday()",但我正在使用QTime :: currentTime(),它使用(正如您提到的)gettimeofday()。 那么看来我做得对,不是吗? - Bobur
最后一个错别字在第1845行。 - Bobur
@Bobur 正如你所说,clock() 函数不计算非 CPU 操作的时间,例如 I/O 操作和内存访问。内存操作(如高速缓存缺失)是被计算在内的。QTime::currentTime() 是正确的选择。 - e.jahandar

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