在Qt中获取已用时间
我正在寻找相当于Qt GetTickCount()
有些东西可以让我测量一段代码运行的时间,如下所示:
uint start = GetTickCount(); // do something.. uint timeItTook = GetTickCount() - start;
有什么build议么?
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
的build议。
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();
一般策略是多次调用观察的方法。 10个呼叫提供1.5毫秒的精度,100毫秒的0,15毫秒。
如果你想使用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 ...
你应该为自己衡量这一点,并尊重你的时间开销。
用以前的答案,这里是一个为你做的一切的macros。
#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毫秒。