Временная часть с высоким разрешением в вашем коде
Я хочу измерить скорость функции внутри цикла. Но почему мой способ делать это всегда печатает "0" вместо высокого времени с 9-значной десятичной точностью (т.е. В нано/микросекундах)?
Каков правильный способ сделать это?
#include <iomanip>
#include <iostream>
#include <time.h>
int main() {
for (int i = 0; i <100; i++) {
std::clock_t startTime = std::clock();
// a very fast function in the middle
cout << "Time: " << setprecision(9) << (clock() - startTime + 0.00)/CLOCKS_PER_SEC << endl;
}
return 0;
}
Вопросы, относящиеся:
Ответы
Ответ 1
Переместите ваши функции вычисления времени вне оператора for () { .. }
, а затем делите общее время выполнения на количество операций в тестовом цикле.
#include <iostream>
#include <ctime>
#define NUMBER 10000 // the number of operations
// get the difference between start and end time and devide by
// the number of operations
double diffclock(clock_t clock1, clock_t clock2)
{
double diffticks = clock1 - clock2;
double diffms = (diffticks) / (CLOCKS_PER_SEC / NUMBER);
return diffms;
}
int main() {
// start a timer here
clock_t begin = clock();
// execute your functions several times (at least 10'000)
for (int i = 0; i < NUMBER; i++) {
// a very fast function in the middle
func()
}
// stop timer here
clock_t end = clock();
// display results here
cout << "Execution time: " << diffclock(end, begin) << " ms." << endl;
return 0;
}
Примечание: std:: clock() не имеет достаточной точности для профилирования. Reference.
Ответ 2
Несколько указателей:
- Я буду осторожен с оптимизатором, он может выбросить весь ваш код, если я подумаю, что он ничего не делает.
- Возможно, вы захотите запустить цикл 100000 раз.
- Прежде чем делать общее время, выберете текущее время в переменной.
- Запустите программу несколько раз.
Ответ 3
Если вам требуется более высокое разрешение, единственный способ перехода зависит от платформы.
В Windows ознакомьтесь с API QueryPerformanceCounter/QueryPerformanceFrequency.
В Linux найдите clock_gettime().
Ответ 4
Возможно, вы захотите изучить openMp.
#include <omp.h>
int main(int argc, char* argv[])
{
double start = omp_get_wtime();
// code to be checked
double end = omp_get_wtime();
double result = end - start;
return 0;
}
Ответ 5
См. вопрос, который я задал об одном и том же: видимо clock()
разрешение не гарантируется настолько высоким.
С++ Получение миллисекундного времени на Linux - clock() не работает должным образом
Попробуйте функцию gettimeofday
или boost
Ответ 6
Если вам нужна независимость от платформы, вам нужно использовать что-то вроде ACE_High_Res_Timer (http://www.dre.vanderbilt.edu/Doxygen/5.6.8/html/ace/a00244.html)