获取经过的时间Qt


74

我正在寻找等效的Qt GetTickCount()

可以让我测量一段代码运行所需时间的方法如下:

uint start = GetTickCount();
// do something..
uint timeItTook = GetTickCount() - start;

有什么建议?

Answers:


94

怎么QTime样 根据您的平台,它应具有1毫秒的精度。代码看起来像这样:

QTime myTimer;
myTimer.start();
// do something..
int nMilliseconds = myTimer.elapsed();

2
在我的WinXP虚拟机上,似乎只有10毫秒的准确性-有人可以确认/否认吗?我正在测试的操作的值分别为0、10和20。
Will Bickford

4
计时时,Windows不如UNIX操作系统那样准确。
内森·穆斯

1
IIRC,在Windows XP上,默认报告的系统时钟分辨率为15ms,但是如果在主板上只有1ms或更好的RTSC,则与Windows相关的一些简单winapi调用仍可能会获得更好的分辨率
quetzalcoatl 2012年

6
QTime不给CPU时间。它提供了总的实时时间,这意味着您也在测量所有其他过程所花费的时间。因此,它对于衡量代码的执行时间不是很有用。
Nikos C.

4
这是一个等待发生的微妙而可怕的错误。它受系统时钟的影响。上帝禁止夏令时发生在您的计时器运行时。
andrewrk

127

我认为最好使用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();

40

即使第一个答案被接受,其他阅读答案的人也应考虑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();

2
再次:这将测量实时时间,而不是进程消耗的CPU时间。
Nikos C.

它通过应用消耗的处理器滴答数乘以每滴答的纳秒数来计算。它测量进程消耗的CPU时间。
莉莲·莫拉鲁

它测量自以来经过的时间start(),而不是过程消耗的时间。这是一个实时计时器。当进程被抢占时(由于多任务处理),时间继续过去,并且QElapsedTimer也会对此进行衡量。如果在抢占进程时停止计时,QElapsedTimer将几乎无用。
Nikos C.

@NikosC。在Qt博客“ Qt有许多计时器,但用于基准测试的最有用的计时器是QElapsedTimer”中,然后“ QElapsedTimer将使用最准确的时钟。但这也意味着计时器的实际分辨率和准确性可能会有很大的不同系统之间。”。它从以下哪个时钟中选择最准确的时钟:qt-project.org/doc/qt-5/qelapsedtimer.html#ClockType-enum
Lilian A. Moraru 2014年

2

如果要使用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 
...

您应该自己衡量这一点,并注意安排时间的开销。


1
我同意。我尝试了QElapsedTimer。似乎与使用该类相关的一些开销。但是非常轻微。差别不大。但是QTime似乎给了我更快的执行时间。我测量了4种方法的数字运算代码(QTime使用3次,QElapsedTimer使用3次)。QElapsed计时器平均测得8.046秒,QTime平均测得8.016秒,相差30毫秒。对于大多数目的而言并不重要,但也许绝对精确。它在Windows 7 64位PC Intel i5上运行32位QT 5.3.1。
te7 2015年

1
在此处查看线​​程qtcentre.org/threads/…–
te7

2

扩展以前的答案,这是一个宏,可以为您完成所有操作。

#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毫秒。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.