2012-04-19 32 views
2

私はいくつかの低レイテンシ技術論文を読んで、CPUを使ってタイミングを測定しました。これは正確です。CPUクロックによる測定時間は?

は通常、Javaで私が使用します。

System.nanoTime() 

およびC++での私は、私はかつて私はナノ秒の精度を行うことができ、オンラインを発見したパフォーマンスカウンタの方法を使用と考えています。それはLARGE_INTEGERを使用し、測定したい精度に割り当てられてから、QueryPerformanceCounter()への参照によって渡され、応答を頻度で除算して返されました。

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

EDIT:

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の回答に興味がありますが、その答えが特定のものかどうかを人々が説明できるかどうかは分かります。

+0

実際にはSystem.nanoTime() – Alan

+0

...これはネイティブメソッドなので、おそらくQueryPerformanceCounter()/ QueryPerformanceFrequency()を内部で使用していると言っています。 – Alan

+0

@Alan、私は実際にそれを見て、私はそれを修正したと思った - 明らかにそうではありません。 – user997112

答えて

1

System.nanoTime()は、OSに応じて、ナノ秒の速い解像度のタイマーを持つことができます。いくつかのOSでは、これは20 nsで高速です。

このライブラリでは、RHEL 5.xは高速で動作するOSの1つではないため、私はRDTSCを使用しています。 :(https://github.com/peter-lawrey/Java-Thread-Affinityこれは、高速PC上で10ns未満かかります。

問題をCPUカウンタを使用しているの異なるソケットで異なる。あなたのプログラムが1つのソケットだけで実行されている場合、これは問題ではありません。

こと
1

マイクロベンチマークは、ガベージコレクションの

  • のJava効果が見落とされてしまう可能性があるいくつかの固有の変数「ウォームアップ」するためにいくつかの時間がかかるJIT最適化の
  • のJava効果
  • のJavaを持っていますターゲットVM
  • のJava VMの設定(-Xnnnnの設定だけでなく、サーバモード対クライアント)
  • ターゲットOSの違い
  • ターゲットCPUの違い
  • 休止:で他のものをマルチタスクCPUがビジー状態でありますベンチマークコード自体

Caliper Micro-benchmarking framework試みのようなツールの背景

  • オーバヘッドが全てではないが、上記の問題の一部に対処します。私はそれがしようとしているすべてのことさえ確信していません。しかし、少なくともJITをウォーミングアップし、ベンチマークコードを固定回数実行して反復回数を平均化し、実行間に許容可能な許容差があるまで数回繰り返します。将来のベンチマークではリンゴと(オレンジの代わりに)リンゴを比較できるように、環境をキャプチャして記録します。また、上記のすべてを繰り返し、異なるVM設定やプログラム引数で簡単に比較し、それぞれの結果を比較することができます。

    しかし、結果を誤って解釈しないようにするにはまだまだ難しい危険が伴います。誰か他の人は結果を誤解します。

    EDIT(追加) 実際、JITは両方の方法をカットできます。一般的には、JITのウォーミングを望む一方で、ベンチマークの一部として含めたいものを最適化することもできます。したがって、ベンチマークを書くことで、ループインバリアントが最適化されるのを予期し、回避することができます。

  • 関連する問題