我正在寻找等效的Qt GetTickCount()
可以让我测量一段代码运行所需时间的方法如下:
uint start = GetTickCount();
// do something..
uint timeItTook = GetTickCount() - start;
有什么建议?
Answers:
怎么QTime
样 根据您的平台,它应具有1毫秒的精度。代码看起来像这样:
QTime myTimer;
myTimer.start();
// do something..
int nMilliseconds = myTimer.elapsed();
我认为最好使用QElapsedTimer
该类,因为这就是该类首先存在的原因。它是在Qt 4.7中引入的。请注意,它也不受系统时钟时间变化的影响。
用法示例:
#include <QDebug>
#include <QElapsedTimer>
...
...
QElapsedTimer timer;
timer.start();
slowOperation(); // we want to measure the time of this slowOperation()
qDebug() << timer.elapsed();
即使第一个答案被接受,其他阅读答案的人也应考虑sivabudh
的建议。
QElapsedTimer
也可以用于计算时间(以纳秒为单位)。
代码示例:
QElapsedTimer timer;
qint64 nanoSec;
timer.start();
//something happens here
nanoSec = timer.nsecsElapsed();
//printing the result(nanoSec)
//something else happening here
timer.restart();
//some other operation
nanoSec = timer.nsecsElapsed();
start()
,而不是过程消耗的时间。这是一个实时计时器。当进程被抢占时(由于多任务处理),时间继续过去,并且QElapsedTimer也会对此进行衡量。如果在抢占进程时停止计时,QElapsedTimer将几乎无用。
如果要使用QElapsedTimer
,则应考虑此类的开销。
例如,以下代码在我的计算机上运行:
static qint64 time = 0;
static int count = 0;
QElapsedTimer et;
et.start();
time += et.nsecsElapsed();
if (++count % 10000 == 0)
qDebug() << "timing:" << (time / count) << "ns/call";
给我这个输出:
timing: 90 ns/call
timing: 89 ns/call
...
您应该自己衡量这一点,并注意安排时间的开销。
扩展以前的答案,这是一个宏,可以为您完成所有操作。
#include <QDebug>
#include <QElapsedTimer>
#define CONCAT_(x,y) x##y
#define CONCAT(x,y) CONCAT_(x,y)
#define CHECKTIME(x) \
QElapsedTimer CONCAT(sb_, __LINE__); \
CONCAT(sb_, __LINE__).start(); \
x \
qDebug() << __FUNCTION__ << ":" << __LINE__ << " Elapsed time: " << CONCAT(sb_, __LINE__).elapsed() << " ms.";
然后,您可以简单地将其用作:
CHECKTIME(
// any code
for (int i=0; i<1000; i++)
{
timeConsumingFunc();
}
)
输出:
onSpeedChanged:102经过的时间:2毫秒。