Получить прошедшее время в Qt

Ищу в Qt аналог GetTickCount()

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

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

какие-либо предложения?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
75
0
93 590
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Ответ принят как подходящий

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

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

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

Will Bickford 13.12.2011 23:31

Windows не так точна, как UNIX-подобная ОС по времени.

Nathan Moos 30.03.2012 21:45

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

quetzalcoatl 11.09.2012 17:32

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

Nikos C. 22.10.2012 03:44

Это незаметная и ужасная ошибка, ожидающая своего появления. На это влияют системные часы. Не дай Бог, чтобы переход на летнее время происходил при включенном таймере.

andrewrk 18.11.2014 23:31

Вау просто вау. Завтра мне придется изменить код на работе, мы используем QTime для статистики ...

Tomáš Zato - Reinstate Monica 17.08.2016 01:37

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

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

Nikos C. 22.10.2012 04:31

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

Lilian A. Moraru 05.11.2012 04:50

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

Nikos C. 05.11.2012 04:58

@NikosC. Из блога Qt: «В Qt есть несколько таймеров, но наиболее полезным для тестирования производительности является QElapsedTimer», тогда «QElapsedTimer будет использовать наиболее точные доступные часы. Однако это также означает, что фактическое разрешение и точность таймера могут сильно различаться. между системами. ". Где выбирает самые точные часы из этих: qt-project.org/doc/qt-5/qelapsedtimer.html#ClockType-enum.

Lilian A. Moraru 03.04.2014 17:00

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

te7 23.06.2015 15:02

См. Ветку здесь qtcentre.org/threads/…

te7 23.06.2015 15:36

Продолжая предыдущие ответы, вот макрос, который все делает за вас.

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

Другие вопросы по теме