用C测量时间
我正在尝试用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.
为什么会这样?
clock
估计程序使用的CPU时间; 这是CPU忙于执行属于您的程序的指令的时间。 sleep
不执行任何工作,因此它不会占用明显的CPU时间(即使它需要挂钟时间)。
如果要测量挂钟时间,请使用time
:
time_t start = time(NULL); sleep(3); printf("%.2f\n", (double)(time(NULL) - start));
将打印一个接近三个的数字。
作为旁注,如果您想以更精确的方式(毫秒)测量执行时间,则time
不够精确。 您可以使用gettimeofday
代替:
#include #include #include 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);
获得正确的值。
使用Orwells中描述的QueryPerformanceFrequency()或使用GetSystemTimeAsFileTime()函数。 后者具有100 ns的粒度,但不以该速率递增。 它的增量取决于硬件的底层和多媒体定时器分辨率的设置。 请记住, QueryPerformanceFrequency()
返回的频率被视为常量。 但是,由于它是由硬件生成的,因此它也具有偏移和时间漂移。 使用QueryPerformanceCounter()
测量时间段通常会伴随每秒许多微秒的错误。 关于类似问题,我已经给出了这个和这个答案。
如果您不关心与Windows绑定,您可以尝试高分辨率计时器。 它比time()更精确,它只有一秒的精度,因为它使用的是UNIX格式。
#include #include __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; }