C でコードのセクションの実行時間を取得する方法を見つけようとしています。すでに time.h から time() と clock() の両方を試しましたが、time() は秒と時計を返すようです() はミリ秒 (またはセンチ秒?) を与えるようですが、もっと正確なものが欲しいです。少なくともマイクロ秒の精度で時間を取得する方法はありますか?
これは、Linux でコンパイルできる必要があるだけです。
あなたは参照しclock()
てtime()
- あなたは探していましたgettimeofday()
か?これによりstruct timeval
、秒とマイクロ秒を含む が入力されます。
もちろん、実際の解像度はハードウェア次第です。
価値のあるものとして、ここにいくつかのマクロがあります。
#include <time.h>
clock_t startm, stopm;
#define START if ( (startm = clock()) == -1) {printf("Error calling clock");exit(1);}
#define STOP if ( (stopm = clock()) == -1) {printf("Error calling clock");exit(1);}
#define PRINTTIME printf( "%6.3f seconds used by the processor.", ((double)stopm-startm)/CLOCKS_PER_SEC);
次に、それを次のように使用します。
main() {
START;
// Do stuff you want to time
STOP;
PRINTTIME;
}
プロファイラーアプリケーションが必要です。
SO および検索エンジンでの検索キーワード: Linux プロファイリング
gettimeofday、 clock_*、またはget/setitimerを見てください。
「bench.h」を試してください。START_TIMER を設定できます。および STOP_TIMER("名前"); これにより、コードの任意のセクションを任意にベンチマークできます (注: 数十ミリ秒以上かかるものではなく、短いセクションにのみ推奨されます)。クロック サイクルに対して正確ですが、まれに、その間のコードのコンパイル方法が変わる可能性があります。
x86 でのみ動作します。
gettimeofday()
マイクロ秒の解像度をclock_gettime()
提供しますが、ナノ秒の解像度を提供します。
int clock_gettime(clockid_t clk_id, struct timespec *tp);
はclk_id
、使用するクロックを識別します。CLOCK_REALTIME
システム全体のクロックをすべてのプロセスに表示する場合に使用します。CLOCK_PROCESS_CPUTIME_ID
プロセスごとのタイマーおよびCLOCK_THREAD_CPUTIME_ID
スレッド固有のタイマーに使用します。
インストルメンテーションツールについては、Google で検索することをお勧めします。
プラットフォームのクロック解像度を超えるライブラリ呼び出しは見つかりません。別のポスターが提案したようにプロファイラー(man gprof)を使用するか、または-迅速で汚い-コードの問題のあるセクションにループを配置して何度も実行し、clock()を使用します。
どの環境/OS で作業しているかはわかりませんが、別のスレッド、タスク、またはプロセスが途中で時間指定されたコードをプリエンプトすると、タイミングが不正確になる可能性があります。ミューテックスやセマフォなどのメカニズムを調べて、他のスレッドがプロセスを先取りするのを防ぐことをお勧めします。
プロファイラーは一般的なグローバル ビューに適していますが、正確なビューが本当に必要な場合は KISS をお勧めします。完了するまでに 1 分ほどかかるように、コードをループで実行するだけです。次に、合計実行時間と実行された反復に基づいて単純平均を計算します。
このアプローチにより、次のことが可能になります。
低分解能タイマーで正確な結果を取得します。
プロセッサーに近い高速キャッシュ (l2、l1、branch..etc) がインストルメンテーションによって干渉される問題が発生しません。ただし、同じコードをタイト ループで実行すると、実際の条件を反映しない楽観的な結果が得られる場合もあります。
x86 または x64 で開発している場合は、Time Stamp Counter: RDTSCを使用しないでください。
RDTSC はアトミック関数であるため、time() や clock() などの Ansi C 関数よりも信頼性が高くなります。この目的で C 関数を使用すると、実行中のスレッドが切り替えられないという保証がないため、問題が発生する可能性があります。その結果、返される値は、測定しようとしている実際の実行時間の正確な説明ではありません。 .
RDTSC を使用すると、これをより適切に測定できます。ティックカウントを人間が読める時間 H:M:S 形式に戻す必要があります。これはプロセッサのクロック周波数に依存しますが、グーグルで検索すると例が見つかると確信しています。
ただし、RDTSC を使用しても、コードが実行されなくなった時間を含めることができますが、正確な測定が必要な場合は time()/clock() を使用するよりも優れたソリューションであり、コードを計測するプロファイラーを使用する必要があります。コンテキストスイッチなどのためにコードが実際に実行されていない場合を考慮してください。