Я ищу эквивалент в Qt до GetTickCount()
Что-то, что позволит мне измерить время, необходимое для выполнения сегмента кода:
uint start = GetTickCount();
// do something..
uint timeItTook = GetTickCount() - start;
любые предложения?
Я ищу эквивалент в Qt до GetTickCount()
Что-то, что позволит мне измерить время, необходимое для выполнения сегмента кода:
uint start = GetTickCount();
// do something..
uint timeItTook = GetTickCount() - start;
любые предложения?
Как насчет 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();
Общая стратегия состоит в том, чтобы вызвать наблюдаемый метод несколько раз. 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
...
Вы должны измерить это для себя и оценить накладные расходы для вашего времени.
Расхожая предыдущие ответы, вот макрос, который делает все для вас.
#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 мс.