C++ 以Qt为单位获取经过的时间

C++ 以Qt为单位获取经过的时间,c++,qt,C++,Qt,我正在寻找Qt中与GetTickCount()等价的函数 这将允许我测量代码段运行所需的时间,如下所示: uint start = GetTickCount(); // do something.. uint timeItTook = GetTickCount() - start; 有什么建议吗?怎么样?根据您的平台,其精度应为1毫秒。代码如下所示: QTime myTimer; myTimer.start(); // do something.. int nMilliseconds = my

我正在寻找Qt中与
GetTickCount()等价的函数

这将允许我测量代码段运行所需的时间,如下所示:

uint start = GetTickCount();
// do something..
uint timeItTook = GetTickCount() - start;
有什么建议吗?

怎么样?根据您的平台,其精度应为1毫秒。代码如下所示:

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

我认为使用它可能更好,因为这就是类首先存在的原因。它是在Qt4.7中引入的。注意,它也不受系统时钟时间变化的影响

用法示例:

#include <QDebug>
#include <QElapsedTimer>
...
...
QElapsedTimer timer;
timer.start();
slowOperation();  // we want to measure the time of this slowOperation()
qDebug() << timer.elapsed();
#包括
#包括
...
...
qedtimer定时器;
timer.start();
slowOperation();//我们要测量此慢速操作的时间()

即使第一个答案被接受,阅读答案的其他人也应该考虑<代码> Svababuh 的建议。br/> 也可用于以纳秒为单位计算时间
代码示例:

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();

如果你想使用,你应该考虑这个类的开销。

例如,以下代码在我的计算机上运行:

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";

你应该自己衡量这一点,并尊重你计时的开销。

在前面的答案的基础上,这里有一个宏可以为你做任何事情

#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.";
#包括
#包括
#定义CONCAT_uux(x,y)x##y
#定义CONCAT(x,y)CONCAT_ux(x,y)
#定义检查时间(x)\
QeflassedTimer CONCAT(sb_uu,uuu线uu)\
CONCAT(sb_uu,uuu线uuu).start()\
x\

在我的WinXP虚拟机上,qDebug()的精确度似乎只有10毫秒-有人能证实/否认这一点吗?对于我正在测试的操作,我得到的值为0、10和20。Windows在计时时不如类UNIX操作系统准确。IIRC,在Windows XP上,默认报告的系统时钟分辨率为15ms,但是,通过一些简单的依赖于windows的winapi调用,如果主板上只有1ms或更好的RTSC,那么仍然可以获得更好的分辨率。QTIME不会给CPU时间。它提供了总的实时性,这意味着你也在测量所有其他过程所花费的时间。所以,它对于测量代码的执行时间不是很有用。这是一个微妙而可怕的错误。它受系统时钟的影响。上帝禁止在计时器运行时使用夏令时。再次说明:这测量的是实时时间,而不是进程所消耗的CPU时间。它通过计算应用程序所消耗的处理器周期数并乘以每个周期的纳秒数来计算夏令时。它测量进程所消耗的CPU时间。它测量自
开始(
)以来经过的时间,而不是进程所消耗的时间。这是一个实时计时器。当进程被抢占时(由于多任务),时间会继续流逝,QElapsedTimer也会测量这一点。如果QElapsedTimer在进程被抢占时停止测量时间,那么它将毫无用处。@NikosC。从Qt博客“Qt有很多定时器,但最有用的基准是QeReleasedTimer”,然后“QeReleasedTimer将使用最精确的时钟。然而,这也意味着定时器的实际分辨率和精度在不同系统之间可能会有很大差异。”。从中选择最精确的时钟:。我同意。我试过了。它似乎有一些与类的使用相关的开销。但是很小。差别并没有那么大。但QTime似乎让我的执行时间快了一点。我测量了4种方法的数字运算代码(QTime 3次,QEDTimer 3次)。QeLassed定时器平均测量8.046秒,QTime平均测量8.016秒,差异为30毫秒。在大多数情况下,差异不显著,但可能是为了绝对精度。这是在Windows 7 64位PC Intel i5上运行QT 5.3.1 32位。请参阅此处的线程
#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();
    }
)