4

我在 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 中测量函数运行时间?什么时钟()实际测量?

环境: virtualBox,Ubuntu14.04 64bit,Qt5.2.1,Qt Creator 3.0.1。

4

2 回答 2

19

您也可以尝试使用 QElapsedTimer:

QElapsedTimer timer;
timer.start();

slowOperation1();

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

QElapsed Timer 的文档

于 2016-12-15T10:28:52.013 回答
1

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

看看这些问题:

时钟()精度

为什么 CLOCKS_PER_SEC 不是每秒的实际时钟数?

在 Qt 源代码中,您将看到 Qt 使用 gettimeofday 在 Unix 下实现 QTime::currentTime() https://github.com/radekp/qt/blob/master/src/corelib/tools/qdatetime.cpp:第 1854 行

于 2016-12-15T10:23:27.597 回答