Как замерить время выполнения кода в миллисекундах?

Рейтинг: 3Ответов: 2Опубликовано: 13.09.2014

Привет.

Использую функцию GetTickCount() для измерения времени выполнения в миллисекундах, но вот кусок кода:

UINT32 start = GetTickCount();
upper = lower + step;
while (upper < n) {
    result += (double)(upper-lower)/6.0*(func(lower,degree) + 4*func(double(upper+lower)/2,degree) + func(upper,degree));
    upper += step;
    lower += step;
}
if (upper >= n) {
    upper = n;
    result += (double)(upper-lower)/6.0*(func(lower,degree) + 4*func(double(upper+lower)/2,degree) + func(upper,degree));
}
UINT32 end = GetTickCount();
UINT32 diff = end - start;

В конце концов получается, что diff = 0. Если в while добавить какой-нибудь вывод (cout), то время наконец-таки замеряется. Так вот вопрос: как можно замерить время выполнения в миллисекундах? Уж больно быстро выполняется программа.

Ответы

▲ 2Принят

Вы никогда не сможете замерить точное время выполнения вашего кода. Многозадачность в Windows - интересная штука, в любой момент времени операционная система может решить переключить контекст выполнения с вашей на другую задачу... И в итоге вы получите не совсем те результаты :) И присуще это не только Windows. В подобных ситуациях обычно поступают следующим образом: замеряют выполнение N повторений требуемого участка, и затем вычисляют среднее время выполнения одного повторения...

▲ 1

Если есть возможность использовать С++11, то подойдет:

#include <chrono>
using namespace std;
...

for(int i = 0; a < 10; i++) { //Для получения среднего времени

    spaceholder_code(i); //Функция, выполняющая случайный код, дабы состояние перед выполнением тестируемого участка было разным.
    auto begin = chrono::high_resolution_clock::now();

    my_finction(); //оцениваемый код.

    auto end = chrono::high_resolution_clock::now();
    cout<<chrono::duration_cast<chrono::nanoseconds>(end-begin).count()<<"ns"<< endl;
}

В NetBeans для этого нужно добавить Project-> compiler-> additional options -> -std=c++11 Опцию можно включить и в других IDE.