




Как насчет QTime? В зависимости от вашей платформы он должен иметь точность 1 миллисекунду. Код будет выглядеть примерно так:
QTime myTimer;
myTimer.start();
// do something..
int nMilliseconds = myTimer.elapsed();
Windows не так точна, как UNIX-подобная ОС по времени.
IIRC, в Windows XP разрешение системных часов по умолчанию составляет 15 мс, но с некоторыми простыми вызовами winapi, зависящими от Windows, вы все равно можете получить лучшее разрешение, если на материнской плате есть только 1 мс или лучше RTSC
QTime не дает процессорного времени. Он дает общее реальное время, а это означает, что вы также измеряете время, затрачиваемое на все другие процессы. Так что это не очень полезно для измерения времени выполнения кода.
Это незаметная и ужасная ошибка, ожидающая своего появления. На это влияют системные часы. Не дай Бог, чтобы переход на летнее время происходил при включенном таймере.
Вау просто вау. Завтра мне придется изменить код на работе, мы используем QTime для статистики ...
Я думаю, что, вероятно, лучше использовать 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 был бы бесполезен, если бы перестал измерять время, когда процесс прерывается.
@NikosC. Из блога Qt: «В Qt есть несколько таймеров, но наиболее полезным для тестирования производительности является QElapsedTimer», тогда «QElapsedTimer будет использовать наиболее точные доступные часы. Однако это также означает, что фактическое разрешение и точность таймера могут сильно различаться. между системами. ". Где выбирает самые точные часы из этих: qt-project.org/doc/qt-5/qelapsedtimer.html#ClockType-enum.
Если вы хотите использовать 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
...
Вы должны измерить это для себя и учитывать накладные расходы на время.
Я согласен. Я попробовал QElapsedTimer. Кажется, есть некоторые накладные расходы, связанные с использованием класса. Но очень незначительное. Разница не такая уж и большая. Но QTime, похоже, дал мне немного более быстрое время выполнения. Я измерил числовой код 4 методов (3 раза с QTime и 3 с QElapsedTimer). Таймер QElapsed показал в среднем 8,046 секунды, а QTime показал в среднем 8,016 секунды, разница составила 30 мс. Не имеет значения для большинства целей, но, возможно, для абсолютной точности. Это работало под управлением 32-разрядной версии QT 5.3.1 на 64-разрядном ПК с Windows 7 Intel i5.
См. Ветку здесь qtcentre.org/threads/…
Продолжая предыдущие ответы, вот макрос, который все делает за вас.
#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 Elapsed time: 2 ms.
На моей виртуальной машине WinXP точность составляет всего 10 мс - может ли кто-нибудь подтвердить / опровергнуть это? Я получаю значения 0, 10 и 20 для операции, которую я тестирую.