我编写了一个示例程序来理解 C 中的时间测量。下面是一个小的自包含示例。我有一个计算素数的函数 do_primes()。在计时代码之间的 main() 函数中,我调用 do_primes() 和 sleep 20 毫秒。我使用 struct timeval 测量时间(我理解它返回时钟时间。)以及使用 CLOCKS_PER_SEC 的 cpu_time。现在据我了解,这表示 CPU 工作的时间。
程序的输出如下。
Calculated 9592 primes.
elapsed time 2.866976 sec.
cpu time used 2.840000 secs.
如您所见,经过时间和cpu时间之间的差异是
0.026976 seconds OR 26.976 milliseconds.
1) Are my assumptions correct?
2) 6.976 milliseconds is accounted for my the scheduler switch delay?
#include <stdio.h>
#include <sys/time.h>
#include <time.h>
#define MAX_PRIME 100000
void do_primes()
{
unsigned long i, num, primes = 0;
for (num = 1; num <= MAX_PRIME; ++num)
{
for (i = 2; (i <= num) && (num % i != 0); ++i);
if (i == num)
++primes;
}
printf("Calculated %ld primes.\n", primes);
}
int main()
{
struct timeval t1, t2;
double elapsedTime;
clock_t start, end;
double cpu_time_used;
int primes = 0;
int i = 0;
int num = 0;
start = clock();
/* start timer*/
gettimeofday(&t1, NULL);
/*do something */
usleep(20000);
do_primes();
/* stop timer*/
gettimeofday(&t2, NULL);
end = clock();
/*compute and print the elapsed time in millisec*/
elapsedTime = (t2.tv_sec - t1.tv_sec) * 1000.0; /* sec to ms*/
elapsedTime += (t2.tv_usec - t1.tv_usec) / 1000.0; /* us to ms */
cpu_time_used = ((double) (end - start)) / CLOCKS_PER_SEC;
printf("elapsed time %f sec. \ncpu time used %f secs.\n",(elapsedTime/1000),cpu_time_used);
return 0;
}