0

C での時間測定を理解するために、サンプル プログラムを作成しました。以下は自己完結型の小さな例です。素数を計算する関数 do_primes() があります。私は 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