2008-10-28 4 views
57

Я ищу эквивалент в Qt для GetTickCount()Получить истекшее время в Qt

Что-то, что позволит мне измерить время, необходимое для сегмента кода для выполнения как в:

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

любые предложения?

ответ

75

Как насчет QTime? В зависимости от вашей платформы она должна иметь точность в 1 миллисекунду. Код будет выглядеть примерно так:

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

На моей виртуальной машине WinXP, похоже, только точность 10 мс - может ли кто-нибудь подтвердить/опровергнуть это? Я получаю значения 0, 10 и 20 для операции, которую я тестирую. –

+3

Windows не так точна, как UNIX-подобная ОС при синхронизации. –

+0

IIRC, в Windows XP стандартное сообщение о системном тактовом разрешении составляет 15 мс, но с некоторыми простыми зависящими от Windows winapi вызовами вы все равно можете получить лучшее разрешение, если на материнской плате есть только 1 мс или лучше RTSC. – quetzalcoatl

103

Я думаю, что это, вероятно, лучше использовать 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(); 
34

Даже если первый ответ был принят, остальные люди, которые читают ответы должны рассмотреть sivabudh «s предложение.
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(); 
+2

Опять же: это измеряет время в реальном времени, а не время процессора, затраченное на процесс. –

+0

Он вычисляет его, беря количество тиков процессора, которые приложение потребляет и умножает на количество наносекунд на один тик. Он измеряет время процессора, затрачиваемое процессом. –

+0

Он измеряет время, прошедшее с момента запуска(), а не время, затрачиваемое процессом. Это таймер в реальном времени. Когда процесс выгружается (из-за многозадачности), время продолжает проходить, и QElapsedTimer тоже это измеряет. QElapsedTimer был бы почти бесполезен, если бы он остановил измерение времени, когда процесс был выгружен. –

1

Общая стратегия заключается в вызов Наблюдаемой методы несколько раз. 10 звонков обеспечивают точность 1,5 мс, 100 один из 0,15 мс.

+0

Это не отвечает на вопрос. Он хочет, чтобы функция давала ему способ измерения времени звонков; вы говорите ему, как уменьшить погрешность по ряду измерений. – itsbruce

1

Если вы хотите использовать 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 
... 

Вы должны измерить это для себя и уважать накладные расходы вашего времени.

+0

Согласен. Я попробовал QElapsedTimer. Кажется, что некоторые из них связаны с использованием класса. Но очень мало. Разница не такая уж большая. Но QTime, казалось, дало мне немного более быстрое время выполнения. Я измерил число хрустящий код из 4 методов (3 раза с QTime и 3 с QElapsedTimer). QElapsed таймер измеряется 8.046 секунд в среднем и QTime измеряется 8.016 секунд в среднем, разница составляет 30 мс. Не важно для большинства целей, но, возможно, для абсолютной точности. Это было запущено QT 5.3.1 32 бит на 64-разрядном ПК под управлением Windows 7 Intel i5. – te7

+0

Смотрите эту тему здесь http://www.qtcentre.org/threads/62883-Simple-stopwatch-to-time-some-code?p=278558#post278558 – te7

1

Затраты предыдущих ответов: вот макрос, который делает все для вас.

#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 мс.

Смежные вопросы