Измерения времени в Си
Я пытаюсь измерить некоторую активность в C (умножение матрицы) и заметил, что я должен сделать что-то вроде этого:
clock_t start = clock();
sleep(3);
clock_t end = clock();
double elapsed_time = (end - start)/(double)CLOCKS_PER_SEC;
printf("Elapsed time: %.2f.n", elapsed_time);
выход:
Elapsed time: 0.00.
почему это происходит?
5 ответов
clock
оценивает время процессора, используемое вашей программой; это время, когда процессор был занят выполнением инструкций, принадлежащих вашей программе. sleep
не выполняет никакой работы, поэтому не занимает заметного времени процессора (даже если это занимает время wallclock).
если вы хотите измерить время выполнения, используйте time
:
time_t start = time(NULL);
sleep(3);
printf("%.2f\n", (double)(time(NULL) - start));
напечатает число, близкое к трем.
в качестве примечания, если вы хотите измерить время выполнения более точным образом (миллисекунды), time
недостаточно точно. Вы можете использовать gettimeofday
вместо:
#include <stdio.h>
#include <unistd.h>
#include <sys/time.h>
int main() {
long start, end;
struct timeval timecheck;
gettimeofday(&timecheck, NULL);
start = (long)timecheck.tv_sec * 1000 + (long)timecheck.tv_usec / 1000;
usleep(200000); // 200ms
gettimeofday(&timecheck, NULL);
end = (long)timecheck.tv_sec * 1000 + (long)timecheck.tv_usec / 1000;
printf("%ld milliseconds elapsed\n", (end - start));
return 0;
}
вы должны использовать time_t start = time(NULL);
и time_t end = time(NULL);
чтобы получить правильные значения.
использовать QueryPerformanceFrequency() как описано в ответе Orwells или используйте GetSystemTimeAsFileTime()
Если вы не заботитесь о привязке к Windows, вы можете попробовать таймер с высоким разрешением. Это намного точнее, чем time (), который имеет точность только в одну секунду, потому что он использует формат UNIX.
#include <iostream>
#include <windows.h>
__int64 countspersec = 0;
double secpercount = 0.0;
__int64 starttime = 0;
__int64 curtime = 0;
int main() {
// Get current time, and determine how fast the clock ticks
QueryPerformanceCounter((LARGE_INTEGER*)&starttime);
QueryPerformanceFrequency((LARGE_INTEGER*)&countspersec);
secpercount = 1.0/(double)countspersec;
/* calculate something */
// Standard end-start stuff, account for clock speed
QueryPerformanceCounter((LARGE_INTEGER*)&curtime);
std::cout << "Time needed: " << (curtime-starttime)*secpercount << " sec\n";
return 0;
}