【问题标题】:time measurement total time vs cpu time时间测量总时间与CPU时间
【发布时间】:2013-06-09 08:46:18
【问题描述】:

我编写了一个示例程序来理解 C 中的时间测量。下面是一个小的自包含示例。我有一个计算素数的函数 do_primes()。在计时代码之间的 main() 函数中,我调用 do_primes()并且还睡眠 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;
}

【问题讨论】:

    标签: c performance time


    【解决方案1】:

    你的理解是正确的。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-20
      • 2013-07-04
      • 1970-01-01
      • 2011-05-17
      • 1970-01-01
      • 2013-12-08
      相关资源
      最近更新 更多