我正在尝试用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.
为什么会这样?
答案 0 :(得分:29)
clock
估算程序使用的CPU时间;这是CPU忙于执行属于您的程序的指令的时间。 sleep
不执行任何工作,因此不会占用明显的CPU时间(即使需要挂钟时间)。
如果您想测量挂钟时间,请使用time
:
time_t start = time(NULL);
sleep(3);
printf("%.2f\n", (double)(time(NULL) - start));
将打印一个接近三个的数字。
答案 1 :(得分:6)
作为旁注,如果您想以更精确的方式(毫秒)测量执行时间,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;
}
答案 2 :(得分:1)
您必须使用time_t start = time(NULL);
和time_t end = time(NULL);
来获取正确的值。
答案 3 :(得分:0)
如果您不关心与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;
}
答案 4 :(得分:0)
按照Orwells回答中的说明使用QueryPerformanceFrequency()或使用GetSystemTimeAsFileTime()功能。后者具有100 ns的粒度,但不会以该速率递增。它的增量取决于底层硬件和multimedia timer resolution的设置。
请记住,QueryPerformanceFrequency()
返回的频率被视为常量。但是,由于它是由硬件生成的,因此它具有偏移和时间漂移。使用QueryPerformanceCounter()
测量时间段通常会伴随每秒许多微秒的误差。
我已经就类似问题给出了this和this的答案。