Cでプログラムのセクションの実行時間を見つけるにはどうすればよいですか?
質問
Cのコードのセクションの実行時間を取得する方法を見つけようとしています。time.hから既にtime()とclock()の両方を試しましたが、time()が返されるようですsecondsとclock()はミリ秒(またはセンチセカンド?)を与えてくれるようです。少なくともマイクロ秒の精度で時間を取得する方法はありますか?
これは、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 。
&quot; bench.h&quot;を試してください; START_TIMERを設定できます。およびSTOP_TIMER(&quot; name&quot;);コードに任意のセクションを任意にベンチマークできるようにします(注:数十ミリ秒以上かかるものではなく、短いセクションにのみ推奨されます)。クロックサイクルに対して正確ですが、まれに、その間のコードのコンパイル方法を変更できる場合がありますが、その場合はプロファイラーを使用したほうがよいでしょう(ただし、プロファイラーは通常、コードの特定のセクションで使用する方が労力がかかります)。
x86でのみ機能します。
計測ツールをグーグルで検索することもできます。
プラットフォームのクロック解像度を超えられるライブラリ呼び出しは見つかりません。別のポスターが示唆するようにプロファイラー(man gprof)を使用するか、または-クイック&amp; dirty-コードの問題のあるセクションをループして何度も実行し、clock()を使用します。
gettimeofday()
はマイクロ秒の解像度を提供しますが、 < code> clock_gettime() は、ナノ秒の解像度を提供します。
int clock_gettime(clockid_t clk_id, struct timespec *tp);
clk_id
は、使用するクロックを識別します。システム全体のクロックをすべてのプロセスから見えるようにする場合は、 CLOCK_REALTIME
を使用します。プロセスごとのタイマーには CLOCK_PROCESS_CPUTIME_ID
を使用し、スレッド固有のタイマーには CLOCK_THREAD_CPUTIME_ID
を使用します。
条件に依存します。プロファイラーは一般的なグローバルビューに適していますが、正確なビューが本当に必要な場合は、KISSをお勧めします。コードをループで実行するだけで、完了までに1分程度かかります。次に、合計実行時間と実行された反復に基づいて単純な平均を計算します。
このアプローチにより、次のことが可能になります。
-
低解像度タイマーで正確な結果を取得します。
-
プロセッサに近い高速キャッシュ(l2、l1、branch..etc)がインストルメンテーションによって妨害される問題に遭遇しない。ただし、同じコードをタイトループで実行すると、現実の状況を反映していない可能性のある楽観的な結果も得られます。
作業している環境/ OSはわかりませんが、別のスレッド、タスク、またはプロセスが途中でタイミングコードを横取りすると、タイミングが不正確になる可能性があります。ミューテックスやセマフォなどのメカニズムを調べて、他のスレッドがプロセスを先取りするのを防ぐことをお勧めします。
x86またはx64で開発している場合、タイムスタンプカウンターを使用しない理由: RDTSC 。
RDTSCはアトミック関数であるため、time()やclock()などのAnsi C関数よりも信頼性が高くなります。この目的でC関数を使用すると、実行中のスレッドが切り替えられないという保証がなく、その結果、返される値が測定しようとしている実際の実行時間の正確な説明にならないため、問題が発生する可能性があります。
RDTSCを使用すると、これをより適切に測定できます。ティックカウントを人間が読める時間H:M:S形式に戻す必要があります。この形式は、プロセッサのクロック周波数に依存しますが、グーグルで検索します。例が見つかるはずです。
ただし、RDTSCを使用しても、コードの実行が切り替えられた時間を含めますが、正確な測定が必要な場合はtime()/ clock()を使用するよりも優れたソリューションであり、プロファイラーを使用する必要がありますコードをインスツルメントし、コンテキストの切り替えなどが原因でコードが実際に実行されていないときに考慮します。