Я хочу узнать, как долго (приблизительно) выполняется какой-то блок кода. Что-то вроде этого:
startStopwatch();
// do some calculations
stopStopwatch();
printf("%lf", timeMesuredInSeconds);
Как?
Я хочу узнать, как долго (приблизительно) выполняется какой-то блок кода. Что-то вроде этого:
startStopwatch();
// do some calculations
stopStopwatch();
printf("%lf", timeMesuredInSeconds);
Как?
Вы можете использовать метод clock
в time.h
Пример:
clock_t start = clock();
/*Do something*/
clock_t end = clock();
float seconds = (float)(end - start) / CLOCKS_PER_SEC;
Вы можете использовать time.h, в частности time и difftime функции:
/* difftime example */
#include <stdio.h>
#include <time.h>
int main ()
{
time_t start,end;
double dif;
time (&start);
// Do some calculation.
time (&end);
dif = difftime (end,start);
printf ("Your calculations took %.2lf seconds to run.\n", dif );
return 0;
}
(Пример адаптирован с веб-страницы difftime, связанной выше.)
Обратите внимание, что этот метод может дать только секундную точность - time_t
записывает секунды с эпоха UNIX (1 января 1970 г.)).
GetTickCount().
#include <windows.h>
void MeasureIt()
{
DWORD dwStartTime = GetTickCount();
DWORD dwElapsed;
DoSomethingThatYouWantToTime();
dwElapsed = GetTickCount() - dwStartTime;
printf("It took %d.%3d seconds to complete\n", dwElapsed/1000, dwElapsed - dwElapsed/1000);
}
Я бы использовал QueryPerformanceCounter и QueryPerformanceFrequency функции API Windows. Вызовите первое до и после блока и вычтите (current & minus; old), чтобы получить количество "тиков" между экземплярами. Разделите это на значение, полученное последней функцией, чтобы получить продолжительность в секундах.
Если вам не требуется фантастическое разрешение, вы можете использовать GetTickCount(): http://msdn.microsoft.com/en-us/library/ms724408(VS.85).aspx (Если это для чего-то другого, кроме вашей собственной простой диагностики, то обратите внимание, что это число может обернуться, так что вам придется обрабатывать это с небольшой арифметикой).
QueryPerformanceCounter - еще один разумный вариант. (Он также описан в MSDN)
Иногда требовалось измерить астрономическое время, а не процессорное время (особенно это применимо в Linux):
#include <time.h>
double what_time_is_it()
{
struct timespec now;
clock_gettime(CLOCK_REALTIME, &now);
return now.tv_sec + now.tv_nsec*1e-9;
}
int main() {
double time = what_time_is_it();
printf("time taken %.6lf\n", what_time_is_it() - time);
return 0;
}
Вы можете использовать библиотеку blockprofile, просто заключив код, который вам нужен для профилирования, следующим образом
time_start("measurethis");
// your code here
time_end("measurethis");
time_summary();