GNU/Linux >> Linux の 問題 >  >> Linux

C の clock() が 0 を返す理由

時間を測定するために 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 のクロック カウントを取得します。 .


    Linux
    1. パスワードハッシュとその必要性

    2. PrintfがEchoよりも優れているのはなぜですか?

    3. なぜCdはプログラムではないのですか?

    1. Df対Du:なぜそんなに違いがあるの??

    2. Nullglobがデフォルトではないのはなぜですか?

    3. gpspipe は正しいタイムスタンプを返すが、日付が間違っている (1995 年 12 月 21 日)

    1. sudo -i はエラーを返します

    2. netstat が非推奨になったのはなぜですか?

    3. なぜ ICMP をブロックしないのですか?