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