Я шукаю еквівалент в 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();
start()
, а не час, витрачений процесом. Це таймер реального часу. Коли процес отримує перевагу (через багатозадачність), час продовжує проходити, і QElapsedTimer також вимірюватиме це. QElapsedTimer був би майже марним, якщо б припинив вимірювати час, коли процес випереджається.
Якщо ви хочете використовувати 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 мс.