Страницы

Поиск по вопросам

суббота, 11 апреля 2020 г.

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

#cpp #время

                    
Привет.
Использую функцию 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), то время наконец-таки замеряется. Так вот вопрос: как можно замерить время
выполнения в миллисекундах? Уж больно быстро выполняется программа.    


Ответы

Ответ 1



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

Ответ 2



Если есть возможность использовать С++11, то подойдет: #include 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<(end-begin).count()<<"ns"<< endl; } В NetBeans для этого нужно добавить Project-> compiler-> additional options -> -std=c++11 Опцию можно включить и в других IDE.

Комментариев нет:

Отправить комментарий