代码之家  ›  专栏  ›  技术社区  ›  shoosh

以qt为单位获取经过的时间

  •  68
  • shoosh  · 技术社区  · 16 年前

    我在找qt与 GetTickCount()

    它允许我测量代码段运行所需的时间,如:

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

    有什么建议吗?

    6 回复  |  直到 7 年前
        1
  •  83
  •   BaCaRoZzo Indie Dev    9 年前

    怎么样 QTime ?根据平台的不同,它应该有1毫秒的精度。代码如下所示:

    QTime myTimer;
    myTimer.start();
    // do something..
    int nMilliseconds = myTimer.elapsed();
    
        2
  •  110
  •   BaCaRoZzo Indie Dev    9 年前

    我觉得最好用 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();
    
        3
  •  34
  •   sivabudh    7 年前

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

    一般策略是多次调用观察到的方法。 10次通话的准确度为1.5毫秒,100次通话的准确度为0.15毫秒。

        5
  •  1
  •   BaCaRoZzo Indie Dev    9 年前

    如果你想用 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 
    ...
    

    你应该为自己量一下这个,并尊重你的时间安排的开销。

        6
  •  1
  •   Damien    8 年前

    扩展前面的答案,这里有一个宏可以为您做任何事情。

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