2

より正確であるため、CPUを介してタイミングを測定した低レイテンシの技術論文をいくつか読みました。

通常、Java では次のように使用します。

System.nanoTime()

C ++では、オンラインで見つけたパフォーマンスカウンターメソッドを使用したことがありますが、これはナノ秒までの精度を実現できます。これは LARGE_INTEGER を使用し、測定したい精度に割り当てられ、参照によって QueryPerformanceCounter() に渡され、回答を頻度で割ったものを返しました。

CPUに応じて時間を測定するためのJava同等のコードはありますか、または何らかのPInvokeを使用する必要がありますか?

編集:

https://www.google.co.uk/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&ved=0CCYQFjAA&url=http%3A%2F%2Fdisruptor.googlecode.com%2Ffiles%2FDisruptor-1.0.pdf&ei= ImmQT5WQMOaW0QWW2sTwAQ&usg=AFQjCNEeGmYXzJa8huMdRGN2p4n8YH-jfg

このレベルの精度で計時するには、CPU からのタイムスタンプ カウンターを使用する必要があります。古いプロセッサは省電力とスリープ状態のために周波数が変化するという問題があるため、不変の TSC を備えた CPU を選択しました。

Windows と Linux の回答に興味がありますが、回答が特定のものに固有のものであるかどうかを説明していただければ幸いです。

4

2 に答える 2

2

System.nanoTime() は、OS によってはナノ秒単位の高速タイマーを持つことができます。一部の OS では、これは 20 ns と高速です。

RHEL 5.x は高速な OS ではないため、このライブラリでは RDTSC を使用しています。:( https://github.com/peter-lawrey/Java-Thread-Affinity高速 PC では 10 ns 未満で済みます。

CPUカウンターを使用する際の問題は、ソケットごとに異なることです。プログラムが 1 つのソケットでのみ実行される場合、これは問題ではありません。

于 2012-04-19T19:50:26.623 に答える
1

マイクロベンチマークには、見落とされる可能性のあるいくつかの固有の変数があります

  • ガベージコレクションのJava効果
  • 「ウォームアップ」に時間がかかるJIT最適化のJava効果
  • JavaターゲットVM
  • Java VM設定(-Xnnnn設定、およびクライアントモードとサーバーモード)
  • ターゲットOSの違い
  • ターゲットCPUの違い
  • 静止:CPUがバックグラウンドで他のものをマルチタスクするのにどれだけ忙しいか
  • ベンチマークコード自体のオーバーヘッド

Caliper Micro-benchmarkingフレームワークのようなツールは、上記の問題のすべてではなく一部に対処しようとします。私はそれがやろうとしていることすべてについてさえ確信がありません。しかし、少なくともそれが行う主な明らかなことは、JITをウォームアップし、ベンチマークコードを一定の回数実行し、反復を平均して、実行間に許容可能な許容差が生じるまでその演習を数回繰り返すことです。また、将来のベンチマークでリンゴを(オレンジではなく)リンゴと比較できるように、環境をキャプチャして記録します。また、上記のすべてを繰り返して、さまざまなVM設定またはプログラム引数と簡単に比較し、それぞれの結果を比較することができます。

とは言うものの、結果を誤解しないようにすること、または他の誰かに結果を誤解させないようにすることは、依然としてトリッキーな危険にさらされた努力です。

EDIT(追加)実際、JITは両方の方法をカットできます。通常、JITをウォームアップする必要がありますが、ベンチマークの一部として含めたいものを最適化することもできます。したがって、測定対象にとって重要/重要な方法で各ループを実際に変化させることにより、ループ不変条件などが最適化されるのを予測および防止するような方法でベンチマークを作成する必要があります。

于 2012-04-19T21:09:38.437 に答える