Linuxを使用してCでいくつかのコードをプロファイリングしたいと思います。私は通常、通常のgettimeofday()
機能を実行するだけです。それらは、簡単に挿入でき、理解しやすく、移植性があります。コードのプロファイリングにCPUカウンターまたはRDTSCを使用しない理由を誰かに尋ねられましたが、RDTSCの方が正確かもしれないことは理解していますが、どちらか一方に賛成または反対することはできません。だから、私の質問は次のとおりです。他のすべてが等しい場合、人々は通常の時間関数またはRDTSCを使用してコードをプロファイルしますか?
2 に答える
ほとんどの場合、私はを使用しますclock_gettime
。他の人が言っているように、gettimeofday
は時代遅れであり、その分解能は10000サイクル未満の範囲の時間を測定するには低すぎます。システムコールのオーバーヘッド(カーネルの開始/終了コスト)が違いに反映されているclock_gettime
可能性があることに注意してください。ただし、最新のx86_64 Linuxシステムでは、clock_gettime
実際にはユーザースペースで完全に実行され、内部で使用されるため、最終rdtsc
的にははるかにポータブルでクリーンになります。の抽象化バージョンrdtsc
。
CPUカウンターと壁掛け時計は、目的ごとに異なるツールです。
壁掛け時計を使用する場合:
標準時間単位(秒など)で時間を測定したい場合。Xタスクにかかる時間を測定する場合は、壁掛け時計を使用してください。
例:
clock()
gettimeofday()
clock_gettime(2)
- 等...
RDTSCを使用する場合:
2つの異なるタスクの相対時間を可能な限り高精度で測定する場合は、RDTSCが適している可能性があります。
RDTSCは、CPUが起動してから経過した疑似サイクル数を測定します。多くの場合(常にではありませんが)、これはプロセッサのCPUクロック速度と同じです。しかし、実際に壁掛け時計に対して測定することなしに、「1秒あたりのダニ」の正確な数を決定することは容易ではありません。
ただし、RDTSCは、時間関数で取得できるオーバーヘッドとほぼ同じです。したがって、ある実装を別の実装と比較してどちらが速いかを判断する場合のマイクロ最適化に適しています。(絶対時間とは対照的に)
注意すべきその他の事項:
- ほとんどの場合、ほとんどのベンチマークの目的は、壁掛け時計で十分に行うことができます。したがって、RDTSCの使用はかなり制限されています。可能な場合は、標準化された機能を使用してください。
- 高精度の壁掛け時計は通常、RDTSCの上に実装されます。したがって、RDTSCを使用して壁時間の高精度な測定値を取得しようとしている場合は、車輪の再発明を行うだけです。
ちなみに、私はRDTSCを、RNGの確認と、オーバークロッカーベンチマークの不正行為防止手段の両方に使用しています。