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

c プログラムの Linux での経過時間の測定

3 つの選択肢

<オール>
  • clock()
  • gettimeofday()
  • clock_gettime()
  • clock_gettime() ナノ秒の精度まで上がり、4 クロックをサポートします。

    • CLOCK_REALTIME

      システム全体のリアルタイム クロック。この時計を設定するには、適切な権限が必要です。

    • CLOCK_MONOTONIC

      設定できず、特定されていない開始点からの単調な時間を表す時計。

    • CLOCK_PROCESS_CPUTIME_ID

      CPU からのプロセスごとの高解像度タイマー。

    • CLOCK_THREAD_CPUTIME_ID

      スレッド固有の CPU タイム クロック。

    として使用できます

    #include <time.h>
    
    struct timespec start, stop;
    
    clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &start);
    
    /// do something
    
    clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &stop);
    
    double result = (stop.tv_sec - start.tv_sec) * 1e6 + (stop.tv_nsec - start.tv_nsec) / 1e3;    // in microseconds
    

    注:clock() 関数は、ウォール クロック時間ではなく、プロセスの CPU 時間を返します。これがOPが興味を持っていたことだと思います。ウォールクロック時間が必要な場合は、以前の回答で示唆されているように gettimeofday() が適切な選択です。システムがサポートしている場合、clock_gettime() はどちらかを実行できます。私の Linux 組み込みシステムでは、clock_gettime() はサポートされていませんが、clock() と gettimeofday() はサポートされています。

    以下は、gettimeofday() を使用してウォール クロック時間を取得するためのコードです。

    #include <stdio.h> // for printf()
    #include <sys/time.h> // for clock_gettime()
    #include <unistd.h> // for usleep()
    
    int main() {
        struct timeval start, end;
        long secs_used,micros_used;
    
        gettimeofday(&start, NULL);
        usleep(1250000); // Do the stuff you want to time here
        gettimeofday(&end, NULL);
    
        printf("start: %d secs, %d usecs\n",start.tv_sec,start.tv_usec);
        printf("end: %d secs, %d usecs\n",end.tv_sec,end.tv_usec);
    
        secs_used=(end.tv_sec - start.tv_sec); //avoid overflow by subtracting first
        micros_used= ((secs_used*1000000) + end.tv_usec) - (start.tv_usec);
    
        printf("micros_used: %d\n",micros_used);
        return 0;
    }
    

    まず、浮動小数点演算を使用する必要があります。より大きな整数値で割った整数値は、常にゼロになります。

    そしてもちろん、実際にするべきです 開始時刻と終了時刻の間の何か。

    ちなみに、gettimeofday にアクセスできる場合 通常は clock よりも優先されます 解像度が高いからです。または多分clock_gettime


    Linux
    1. Linux –エントロピー品質を測定するためのツール?

    2. より速く開始するためにプログラムをプリロードする方法は?

    3. Linux用の最高の無料時計

    1. 初心者向けのLinuxタイムコマンドチュートリアル(例付き)

    2. Linux で時間を測定する - 時間 vs クロック vs getrusage vs clock_gettime vs gettimeofday vs timespec_get?

    3. Linux で起動時に実行中のプログラムを停止する

    1. Linuxスリープコマンド–指定された時間の遅延

    2. 7 ハードウェア クロックの日付時刻を設定する Linux hwclock コマンドの例

    3. Linux シェル スクリプトまたは変数の日付と時刻の書式設定