20

C(行列乗算)でいくつかのアクティビティを測定しようとしていますが、次のようなことを行う必要があることに気付きました。

clock_t start = clock();
sleep(3);
clock_t end = clock();
double elapsed_time = (end - start)/(double)CLOCKS_PER_SEC;
printf("Elapsed time: %.2f.\n", elapsed_time);

出力は次のとおりです。

Elapsed time: 0.00.

なぜこうなった?

4

5 に答える 5

31

clockプログラムで使用されるCPU時間を見積もります。これは、CPUがプログラムに属する命令の実行でビジー状態になっている時間です。sleepは何の作業も実行しないため、CPU時間はそれほどかかりません(実時間の時間がかかる場合でも)。

壁時計の時間を測定したい場合は、以下を使用してtimeください。

time_t start = time(NULL);
sleep(3);
printf("%.2f\n", (double)(time(NULL) - start));

3に近い数値を出力します。

于 2012-10-31T10:41:52.907 に答える
12

ちなみに、実行時間をより正確に(ミリ秒)測定したい場合は、time十分に正確ではありません。代わりに使用できますgettimeofday

#include <stdio.h>
#include <unistd.h>
#include <sys/time.h>

int main() {
    long start, end;
    struct timeval timecheck;

    gettimeofday(&timecheck, NULL);
    start = (long)timecheck.tv_sec * 1000 + (long)timecheck.tv_usec / 1000;

    usleep(200000);  // 200ms

    gettimeofday(&timecheck, NULL);
    end = (long)timecheck.tv_sec * 1000 + (long)timecheck.tv_usec / 1000;

    printf("%ld milliseconds elapsed\n", (end - start));

    return 0;
}
于 2017-08-19T09:05:46.057 に答える
2

とを使用time_t start = time(NULL);time_t end = time(NULL);て正しい値を取得する必要があります。

于 2012-10-31T10:43:08.423 に答える
0

Orwellsの回答で説明されているようにQueryPerformanceFrequency()を使用するか、 GetSystemTimeAsFileTime()関数を使用します。後者の粒度は100nsですが、その速度では増加しません。その増分は、基盤となるハードウェアとマルチメディアタイマーの解像度の設定によって異なります。によって返される周波数はQueryPerformanceFrequency()定数として扱われることに注意してください。ただし、ハードウェアによって生成されるため、時間のずれとドリフトもあります。を使用して時間の期間を測定するQueryPerformanceCounter()と、通常、1秒あたり数マイクロ秒の誤差が伴います。私はこれと同様の問題についてこの答えを与えました。

于 2012-10-31T12:13:25.497 に答える
-1

Windowsに縛られることを気にしない場合は、高解像度タイマーを試すことができます。これは、UNIX形式を使用しているため1秒の精度しかないtime()よりもはるかに正確です。

#include <iostream>
#include <windows.h>

__int64 countspersec = 0;
double secpercount = 0.0;
__int64 starttime = 0;
__int64 curtime = 0;

int main() {

    // Get current time, and determine how fast the clock ticks
    QueryPerformanceCounter((LARGE_INTEGER*)&starttime);
    QueryPerformanceFrequency((LARGE_INTEGER*)&countspersec);
    secpercount = 1.0/(double)countspersec;

    /* calculate something */

    // Standard end-start stuff, account for clock speed
    QueryPerformanceCounter((LARGE_INTEGER*)&curtime);
    std::cout << "Time needed: " << (curtime-starttime)*secpercount << " sec\n";
    return 0;
}
于 2012-10-31T10:53:05.297 に答える