削除しました、ごめんなさい.........................................。
3 に答える
を使用n=30
すると、プログラムは非常に少量の作業を行うため、粗いclock
粒度でゼロ時間として表示されます。一部のシステムでは、clock
10ms ごとに 1 回ティックします。かなり高速なコンソール I/O を使用していると仮定すると、おそらく数十または数百マイクロ秒の範囲にあり、おそらく 99.99% の時間をprintf
.
1000000 のような大きな数値を入力してみてください。そうすると、ゼロ以外の数値が得られるはずです。
これを試して
struct timeval start, end;
long mtime, secs, usecs;
gettimeofday(&start, NULL);
// your processing.
gettimeofday(&end, NULL);
secs = end.tv_sec - start.tv_sec;
usecs = end.tv_usec - start.tv_usec;
mtime = ((secs) * 1000 + usecs/1000.0) + 0.5;
printf("Elapsed time: %ld millisecs\n", mtime);
問題は、整数除算を行ってから浮動小数点数に変換していることです。それ以外の場合、結果は最も近い秒に切り捨てられます。(y-x)
分割する前に float にキャストする必要があります。
z = (float)(y-x) / CLOCKS_PER_SEC;
プログラムがクロック粒度よりも速く実行される場合、何をしてもゼロになります (y
とx
が同じになるため)。 しかし、少なくとも浮動小数点除算では、それ以外の場合は小数秒を取得できます。
[編集]実際、私の間違いです。何らかの理由でx
、 とy
は整数であると考えました ( の戻り値を格納するためにそれらを使用していたためclock
)。したがって、この場合、おそらくクロック サイクルよりも速く実行されています。
高速な操作をベンチマークする場合は、次のいずれかまたは両方を実行する必要があります。
- 操作を何度も繰り返す (千、百万...)
- より高い解像度のタイマーを使用する