Сроки высокого разрешения часть вашего кода - PullRequest
7 голосов
/ 31 марта 2009

Я хочу измерить скорость функции в цикле. Но почему мой способ сделать это всегда печатать «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;
}

Похожие вопросы:

Ответы [ 6 ]

6 голосов
/ 31 марта 2009

Переместите свои функции вычисления времени за пределы оператора 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 () не хватает точности для профилирования. Ссылка .

3 голосов
/ 31 марта 2009

Если вам нужно более высокое разрешение, единственный способ - это зависеть от платформы.

В Windows проверьте API QueryPerformanceCounter / QueryPerformanceFrequency .

В Linux найдите clock_gettime () .

3 голосов
/ 31 марта 2009

Несколько указателей:

  1. Я бы был осторожен с оптимизатором, он может выбросить весь ваш код, если я подумаю, что он ничего не делает.
  2. Возможно, вы захотите запустить цикл 100000 раз.
  3. Перед вычислением общего времени сохраните текущее время в переменной.
  4. Запустите вашу программу несколько раз.
2 голосов
/ 06 апреля 2009

Если вам нужна независимость от платформы, вам нужно использовать что-то вроде ACE_High_Res_Timer (http://www.dre.vanderbilt.edu/Doxygen/5.6.8/html/ace/a00244.html)

2 голосов
/ 31 марта 2009

См. Вопрос, который я задал по поводу того же: очевидно, разрешение clock() не гарантируется таким высоким.

C ++ получает время в миллисекундах в Linux - часы () не работают должным образом

Попробуйте gettimeofday функцию или boost

1 голос
/ 31 марта 2009

Возможно, вы захотите изучить использование 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;
}
...