Как измерить время работы функции в Qt?

Я вызываю argon2 — функцию хеширования с интенсивным использованием памяти в Qt и измеряю время ее работы:

...
QTime start = QTime::currentTime();
// call hashing function
QTime finish = QTime::currentTime();
time = start.msecsTo(finish) / 1000.0;
...

В тестовом примере библиотеки argon2 время измеряется другим способом:

...
clock_t start = clock();
// call hashing function
clock_t finish = clock();
time = ((double)finish - start) / CLOCKS_PER_SEC;
...

Я вызываю функцию точно так же, как они вызывают в своем тестовом примере. Но я получаю в два раза большее число (в два раза медленнее). Почему? Как измерить время работы функции в Qt? Какие часы() на самом деле измеряют?

env: виртуальная коробка, Ubuntu 14.04 64-разрядная версия, Qt5.2.1, Qt Creator 3.0.1.


person Bobur    schedule 15.12.2016    source источник
comment
Возможный дубликат c++/Qt - время вычислений   -  person PsiX    schedule 15.12.2016
comment
Не знаю, что это за штука argon2, но она выглядит не слишком адекватно... Правильный способ сделать это - использовать QElapsedTimer, который тривиален в использовании и максимально точен для вашей платформы.   -  person dtech    schedule 15.12.2016
comment
@PsiX отредактировано. Я хотел знать причину разницы между временами   -  person Bobur    schedule 16.12.2016
comment
@Bobur Хорошо, так почему ты принял ответ, который не отвечает на этот вопрос?   -  person PsiX    schedule 16.12.2016
comment
@PsiX, один предложил мне использовать QElapsedTimer, другой предложил не использовать clock(). И оба объяснили свою точку зрения. Теперь я знаю, что делать. Я хотел бы принять оба ответа, но не могу. Но мне интересно, почему вы спрашиваете об этом? Что не так с этим?   -  person Bobur    schedule 19.12.2016
comment
@Bobur Вы должны принимать только те ответы, которые действительно отвечают на ваш вопрос. Или обновите свой вопрос, чтобы он больше соответствовал принятому вами ответу. Но я получаю в два раза большее число (в два раза медленнее). Почему? У вас есть ответ на этот вопрос? Ответ, который вы приняли, уже дублирует ваш второй вопрос (Как измерить время выполнения функции в Qt?). Вы должны уточнить, что вы спрашиваете.   -  person PsiX    schedule 19.12.2016


Ответы (2)


Вы также можете попробовать использовать QElapsedTimer:

QElapsedTimer timer;
timer.start();

slowOperation1();

qDebug() << "The slow operation took" << timer.elapsed() << "milliseconds";
qDebug() << "The slow operation took" << timer.nsecsElapsed() << "nanoseconds";

Документация по таймеру QElapsed

person Tom Conijn    schedule 15.12.2016

clock() не точен для измерения времени, затрачиваемого на функции. Он просто возвращает количество тиков для всей программы, пока она находится на процессоре прямо сейчас, он не считает блокировку операций ввода-вывода или спящий режим. Он просто считает тики, которые ваша программа работает на процессоре (обработка). Если вы поместите сон в свой код, вы потеряете ЦП, и это время не учитывается с помощью clock(). Вы должны использовать time() или gettimeofday() или более точную инструкцию сборки rdtsc.

Посмотрите на эти вопросы:

точность часов()

Почему CLOCKS_PER_SEC не является фактическим количество часов в секунду?

В исходниках Qt вы увидите, что Qt использовал gettimeofday для реализации QTime::currentTime() под Unix https://github.com/radekp/qt/blob/master/src/corelib/tools/qdatetime.cpp: строка 1854

person e.jahandar    schedule 15.12.2016
comment
Это во многом неправда. Давным-давно это было правдой, когда процессоры работали на фиксированной частоте. Сегодня это не так, и clock() реализован по-другому и довольно точен, если вы можете установить миллисекундное разрешение. - person dtech; 15.12.2016
comment
@ddriver C говорит, что часы возвращают наилучшее приближение реализации к процессорному времени, используемому программой с начала определяемой реализацией эры, связанной только с вызовом программы. stackoverflow.com/a/9871772/4490542 - person e.jahandar; 15.12.2016
comment
@e.jahandar Если я запускаю две функции в течение, скажем, 1 секунды, первая с интенсивным использованием ЦП (выполняет много вычислений) и другая функция, связанная с памятью (выполняет чтение/запись большого количества блоков памяти), и измеряю их время с помощью clock(), Вы имеете в виду, что время clock() для функции с интенсивным использованием ЦП показывает больше времени, чем для второй функции, даже если фактическое время работы такое же? - person Bobur; 16.12.2016
comment
@e.jahandar Еще одна вещь: вы предложили мне использовать time() или gettimeofday(), но я использую QTime::currentTime(), который использует (как вы упомянули) gettimeofday(). Тогда кажется, что я поступаю правильно, не так ли? - person Bobur; 16.12.2016
comment
И опечатка в самом конце, это строка 1845 - person Bobur; 16.12.2016
comment
@Bobur, как вы сказали, clock () не учитывает операции, не связанные с процессором, такие как операции ввода-вывода, а не память, учитываются операции с памятью, такие как промахи кеша. QTime::curentTime() - это правильно - person e.jahandar; 16.12.2016