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

C++ 如何在Qt中测量函数运行时间?,c++,qt,clock,time-measurement,qtime,C++,Qt,Clock,Time Measurement,Qtime,我在Qt中调用内存密集型散列函数并测量其运行时间: ... QTime start = QTime::currentTime(); // call hashing function QTime finish = QTime::currentTime(); time = start.msecsTo(finish) / 1000.0; ... 在argon2库的测试用例中,时间是以另一种方式测量的: ... clock_t start = clock(); // call hashing func

我在Qt中调用内存密集型散列函数并测量其运行时间:

...
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中测量函数运行时间?实际测量的时钟是什么

env:virtualBox、Ubuntu14.04 64位、Qt5.2.1、Qt Creator 3.0.1。

时钟()对于测量函数中的时间花费不准确。它只返回整个程序在CPU上运行时的滴答数,不计算阻塞IO操作或休眠。它只计算程序在CPU上运行的滴答声(处理)。如果您在代码中加入睡眠,您将丢失CPU,而这一时间不使用clock()计数。 必须使用time()或gettimeofday()或更精确的rdtsc汇编指令

看看这些问题:

在Qt源代码中,您将看到Qt使用gettimeofday在Unix下实现QTime::currentTime()
:第1854行

您也可以尝试使用QeLassedTimer:

QElapsedTimer timer;
timer.start();

slowOperation1();

qDebug() << "The slow operation took" << timer.elapsed() << "milliseconds";
qDebug() << "The slow operation took" << timer.nsecsElapsed() << "nanoseconds";
qeversedtimer定时器;
timer.start();
慢操作1();

qDebug()可能重复Dunno的“argon2”是什么,但它看起来不太合适。。。正确的方法是使用
QElapsedTimer
,它使用起来很简单,并且在您的平台上尽可能精确。@PsiX已编辑。我想知道他们之间的差异的原因times@Bobur好的,那么为什么你接受了一个没有回答这个问题的答案?@PsiX,一个建议我使用QElapsedTimer,一个建议不要使用clock()。两人都解释了他们的观点。现在我知道该怎么办了。我想接受这两个答案,但我不能。但我想知道你为什么问这个?这有什么不对吗?这基本上是不正确的。很久以前,当CPU以固定频率运行时,这是真的。如今它们没有,而clock()是以不同的方式实现的,如果你能用毫秒分辨率来解决,它是相当准确的。@ddriver C说clock“返回自仅与程序调用相关的实现定义纪元开始以来程序使用的处理器时间的实现最佳近似值@e、 jahandar如果我在1秒内运行两个函数,第一个是CPU密集型函数(进行大量计算),另一个是内存绑定函数(进行大量内存块读/写),然后用clock()测量它们的时间,你是说clock()吗CPU密集型函数的时间显示比第二个函数的时间长,即使实际运行时间相同?@e.jahandar还有一件事,您建议“我必须使用time()或gettimeofday()”,但我使用的是QTime::currentTime(),它使用(如您所述)gettimeofday()。看来我做的是对的,不是吗?最末端的打字错误是1845行