0

我编写了一个示例程序来理解 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;
}
4

1 回答 1

3

你的理解是正确的。

额外的 6.976 毫秒可能根本没有任何意义,因为该clock()函数可能只有 10 毫秒的分辨率。

于 2013-06-13T04:20:23.767 回答