2011-06-03 6 views
1

MethodEntryMethodExit JVMTIが提供するイベントフックを使用すると、Javaで実行されるメソッドの時間をどのように測定できますか?JVMTIによる測定方法の実行

単純に言えば、それはちょうど:time2 - time1ですが、私が見る問題は、どうやって別の方法を区別するのですか? methodIDはありますが、再帰呼び出しはどうですか?メソッドが開かれた後に閉じられるのはいつですか?

スタックトレースを比較する必要がありますか?入力されたメソッドをトレースする意味のあるデータ構造は何でしょうか? Map<StackTrace,Time>?

答えて

5

ような何かあなたがすべてのスレッドのスタックが必要になりますと、すべてのMethodEnterであなたは、スタック上、あなたがタイムスタンプをポップし、現在の時刻に差を算出MethodExitのタイムスタンプを押してください。

タイムスタンプまたはチックカウントの読み取りとその周囲のロジックも比較的時間がかかることに注意してください。ある種のプロファイラでこれを使用すると、小さな高速メソッドを非常に高価なものにする結果が得られます。私。 ByteBuffer.get()は測定コードよりも少なくとも10倍高速に実行されます。限られたJITコンパイルによる歪みとともに、JVMTIがアクティブな場合、このようなメソッドは、通常の状況下で収集されたデータよりも100倍重く見えることがあります。メソッドの実行時間シェアの幾分使用可能なデータを取得する唯一の方法は、サンプリングを使用することです。

+0

ありがとう、これは非常に便利な答えでした。時間を測定するこの方法を使用することへの影響は私にはよく知られており、まったく問題ありません。私は時間を表示するためにドロップするかもしれませんが、他のすべての実行と比較して全体のパーセンテージだけを表示します。 –

関連する問題