時間を測定するために clock() を使用する正しい方法は次のとおりです:
printf("\nTime elapsed: %.2f\n",1.0*(end-start)/CLOCKS_PER_SEC);
これは、clock_t が int やその他の型であることが保証されていないためです。
さて、時間 something_else()
が欲しいですか? かかりますか?これを試してください:
#include <sys/time.h>
#include <stdio.h>
#include <unistd.h>
int main(void) {
struct timeval start, end;
long mtime, secs, usecs;
gettimeofday(&start, NULL);
something_else();
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);
return 0;
}
その理由は あなたの something_else()
だと思います clock()
の精度を超えるわずかな時間しか消費しません . clock()
を呼び出してみました 結果として 2 回、両方とも start
および end
はゼロですが、その間に時間のかかる作業を行った場合の結果は妥当です。
これが私のテスト コード スニペットです:
int main(void) {
clock_t start, end;
start = clock();
int c;
for (int i = 0; i < 100; i++) {
for (int j = 0; j < (1<<30); j++) {
c++;
}
}
end = clock();
printf("start = %d, end = %d\n", start, end);
return 0;
}
私のコンピューターでの結果は次のとおりです。
start = 0, end = 27700000
また、2 つのヒント:
<オール>something_else()
と思うかもしれません は時間がかかりますが、コンパイラはこれらの操作 (特にループ) を無意味と見なして無視する場合があります。sizeof(clock_t)
を使用 お使いのプラットフォームで clock_t
のサイズを確認してください .
clock
関数は CPU クロック サイクルを測定しません。
C は clock
と言います "実装の最良の概算を返します プログラムの呼び出しのみに関連する実装定義の時代の始まり以降、プログラムによって使用されたプロセッサ時間まで."
連続する 2 つの clock
の間にある場合 あなたがプログラムした呼び出しは clock
の 1 ユニティよりも短い時間で済みます 関数、あなたは 0
を得ることができます .
POSIX clock
CLOCKS_PER_SEC
でユニティを定義します 1000000 として (単位は 1 マイクロ秒です)。
http://pubs.opengroup.org/onlinepubs/009604499/functions/clock.html
x86/x64 でクロック サイクルを測定するには、インライン アセンブリを使用して、CPU タイム スタンプ カウンター レジスター rdtsc
のクロック カウントを取得します。 .