2013-06-13 58 views
0

我寫了一個示例程序,以瞭解C.Below中的時間測量是一個小型自包含示例。我有一個函數do_primes()來計算素數。在main()函數我調用do_primes()的時間代碼,也休眠20毫秒。我使用struct timeval(我知道它會返回時鐘時間)測量時間,並且還使用CLOCKS_PER_SEC.Now測量時間,因爲據我瞭解,這表示CPU正在工作。時間測量總時間與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; 
} 

回答

3

你的理解是正確的。

額外的6.976ms可能並不意味着什麼,因爲clock()函數可能只有10ms的分辨率。