Cでの最良のタイミング方法は?


80

高解像度と移植性を備えたコードセクションの時間を計る最良の方法は何ですか?

クロスプラットフォームソリューションを持つ標準ライブラリはありますか?

回答:


137

私はこれがうまくいくと思います:


10
これは、経過時間ではなくCPU時間を提供するため、実際には優れています(経過時間は他のプロセスの影響を受ける可能性があります)。I / Oの考慮事項がある場合があるため、10秒という数字は、必ずしも10秒の経過時間で実行されることを意味するわけではないことに注意してください。これはCPUのみを測定します。
paxdiablo 2009年

1
私はこれを何百回も使用しましたが、この質問に対する最良/最も簡単な解決策です
Gerhard

4
複数のタイミングを頻繁に取る場合は、これをすべてマクロに詰め込むこともできます。#define Timing(a)start = clock(); a; diff = clock()-開始; msec = diff * 1000 / CLOCKS_PER_SEC; printf( "msecs:%d \ n"、msec); 次に、次を呼び出します。timing(IntenseFunc1())
eqzx 2012

3
clock_tは通常長く、CLOCKS_PER_SECは1000000です。この場合、4秒を超える差があると、オーバーフローと奇妙な結果が発生します
Begelfor 2014年

2
@paxdiablo gettimeofday()とまったく同じ結果が得られますが、ここで何を言っているのかわかりません。
user3467349 2014年

21

gettimeofday()は、おそらくあなたが望むことをするでしょう。

Intelハードウェアを使用している場合、CPUリアルタイム命令カウンターを読み取る方法は次のとおりです。プロセッサが起動してから実行されたCPUサイクル数が表示されます。これはおそらく、パフォーマンス測定のために取得できる最もきめの細かい、最も低いオーバーヘッドカウンターです。

これはCPUサイクル数であることに注意してください。Linuxでは、CPU速度を/ proc / cpuinfoから取得し、除算して秒数を取得できます。これをdoubleに変換すると非常に便利です。

これをボックスで実行すると、

11867927879484732
11867927879692217
printfを呼び出すのにこれほど長い時間がかかりました:207485

これは、多くの詳細を提供するIntel開発者ガイドです。




1

CPU時間を必要としない場合は、timeval構造体を探していると思います。

実行時間の計算には以下を使用します。


0

高解像度は相対的です...私は例を見ていました、そしてそれらはほとんどミリ秒に対応します。ただし、私にとってはマイクロ秒を測定することが重要です。プラットフォームに依存しないマイクロ秒のソリューションは見たことがなく、以下のコードのようなものが役立つと思いました。私は当分の間Windowsでタイミングをとっていましたが、AIX / Linuxで同じことを行う場合は、おそらくgettimeofday()実装を追加します。

使用法:

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.