C コードの関数の時間をナノ秒単位で計算する方法を知る必要があります。数マイクロ秒を消費するまで関数を繰り返そうとしました。time.h
ナノ秒単位で時間を計算するために使用できる他の関数はありますか?
4 に答える
ナノ秒の精度が得られることは決してありません。何を求めているか考えてみてください。1GHzのCPUでは、1ナノ秒がクロックサイクルです。何を呼ぼうとしても、そのような精度は得られません。マイクロ秒に固執する方がよいでしょう。多くの例を含む同様の質問がここにあります:C++クロスプラットフォーム高解像度タイマー。
cの場合のみ:WindowsではQueryPerformanceCounterを使用します。そして、ここにQPCの詳細があります。これは、 QueryPerformanceCounterの使用方法に関する関連する質問です。
これにどのようにアプローチするか、または使用しているシステム/OS のタイプに関係なく、問題の性質によりかなりのばらつきがありますが、せいぜいおおよその答えしか得られません。
次に、この種の通話をサポートするシステムが必要です。QNX Neutrino を使用している場合は、非常に簡単です。
http://www.qnx.com/developers/docs/6.3.0SP3/neutrino/lib_ref/c/clock_gettime.html
/*
* This program calculates the time required to
* execute the program specified as its first argument.
* The time is printed in seconds, on standard out.
*/
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <time.h>
#define BILLION 1000000000L;
int main( int argc, char** argv )
{
struct timespec start, stop;
double accum;
if( clock_gettime( CLOCK_REALTIME, &start) == -1 ) {
perror( "clock gettime" );
return EXIT_FAILURE;
}
system( argv[1] );
if( clock_gettime( CLOCK_REALTIME, &stop) == -1 ) {
perror( "clock gettime" );
return EXIT_FAILURE;
}
accum = ( stop.tv_sec - start.tv_sec )
+ (double)( stop.tv_nsec - start.tv_nsec )
/ (double)BILLION;
printf( "%lf\n", accum );
return EXIT_SUCCESS;
}
標準 Cのclock
関数は、これには役に立ちません。通常、解像度はひどいものであり、(プラットフォーム間で) 経過時間または消費された CPU 時間を測定するかどうかに一貫性がありません。POSIX 標準clock_gettime
関数 (ナノ秒単位の分解能があり、測定対象のクロックを指定できます) を使用し、POSIX 関数がないプラットフォームで利用可能なシステム固有のクロック操作でエミュレートする必要があります。
合計時間を秒単位で取得するのに十分な回数関数を呼び出し、任意の方法を使用して測定します (単純な C の clock() であっても)。マイクロ/ナノ秒単位の測定は本質的に不正確です。
ベンチマークには、 QueryPerformanceCounterが必要です。これは、Windows で利用できる最高のストップウォッチです。参照: QueryPerformanceCounter の使用方法 ただし、これを使用して (たとえば) 単一の関数呼び出しを測定しても、本質的に非常に不正確です。測定で良好な信号対雑音比を得るには、合計で 1 秒程度の時間が必要だと思います。必要な期間の複数の測定を行い、その値を標準偏差と比較して、測定が十分に正確であることを確認します。
マルチメディア タイマーは、おそらく Windows で利用できる最高の時計です (時計とストップウォッチの違いに注意してください。一方は絶対時間を測定し、もう一方は時間間隔のみを測定します)。timeGetTime ()を使用すると、ミリ秒に近い解像度と精度を得ることができるはずです。