[Metric]メニューの[Inclusive Method Times (Clock)]オプションは、そのメソッドと、そのメソッドが呼び出したメソッドで経過した時間の合計をミリ秒単位で示したものです。数値はメソッドの左側に表示されます。
[Metric]メニューの下にある[Inclusive Method Times (CPU)]と[Exclusive Method
Times (CPU)]も便利なメトリクスです。このメトリクスは、プロファイラによっては使用できないことがあります。このオプションは、そのメソッドで使用されたCPU時間を表示します。メソッド呼び出しの左側にある数字は、おおよその時間をミリ秒で示したものです。これは、概算値としてのみ参照してください。CPU時間とクロック時間を比較して、同期メソッドや同期ステートメントのためにどのメソッドで長い待ち時間が発生しているかを判定することができます。
メソッドの検索
前に[Mark to Find]を設定したメソッドが参照中のメトリクスのどこにあるかを確認したい場合は、[Binoculars
With a Lightning Bolt]アイコンをクリックするか、[Edit]メニューから[Find Immediately]を選択します。または、[Edit]メニューから[Find]を選択して次のようなダイアログを表示し、パッケージ名、クラス名、メソッド名でメソッドを検索できます。これは、一つのクラスやパッケージに関連付けた複数のメソッドを参照する場合に便利な方法です。
例
[Method Call Counts]ウィンドウで、nextTokenメソッドに[Mark
to Find]を設定してあります。ここで[Binoculars With a Lightning Bolt]アイコンをクリックするか、[Edit]メニューから[Find
Immediately]を選択します。このメソッドは、相対的に見るとそれほど多くの時間を消費していないことがわかります。そこで、多くのクロック時間を使っているメソッドを検索します。この例では、2番目のメソッドであるsocketReadが、invokeを除く他のメソッドのほぼ倍の時間を使用しています。このメソッドに[Mark
to Find]を設定して、詳しく調査できるようにします。
メトリクスの比較
HPjmeterでは、複数のウィンドウを開いて簡単に比較作業をすることができます。[File]メニューから[New
Window]を選択します。1つのウィンドウで[Exclusive Method Times (Clock)]を、もう一方のウィンドウで[Exclusive
Method Times (CPU)]を参照します。2つの測定結果を比較するには、[Find]機能を使用します。大きな差があれば、長い待ち時間を消費しているメソッドを見つける手がかりになります。この待ち時間を減らすことができれば、パフォーマンスを改善できます。
あるメソッドを呼び出したメソッドを知りたい場合は、そのメソッドをダブルクリックします。オープンされたウィンドウには、呼び出し回数ではなくクロック時間やCPU時間が表示されます。(注意:
これは包括的な測定の場合にのみ表示されます。排他的な場合は表示されません)また、疑わしいメソッドをマークして、[Call Graph
Tree]で参照することもできます。チェックマーク アイコンをクリックするか、[Edit]メニューから[Mark to Find]を選択します。
クラス実行時間の参照
[Class Times]メトリクスは、クロック時間とCPU時間で利用できます。このメトリクスを参照するには、[Metric]メニューから[Exclusive
Class Times (Clock)]か[Exclusive Class Times (CPU)]を選択します。すると、次のようなウィンドウが表示されます。
様々なメソッド実行時間のメトリクスやメソッド呼び出し回数を参照していて、詳しく調査する必要のあるメソッドを見つけたとします。例えば、メソッドjava.net.SocketInputStream.socketReadを呼び出しているメソッドについて詳しく知る必要があるとします(排他的クロック時間が2番目に高いメソッドです)。前に[Mark
to Find]を設定していますので、[Binoculars with a Lightning Bolt]アイコンをクリックするか、[Edit]メニューから[Find
Immediately]を選択します。これによりツリーが展開され、次に示すように、参照したいメソッドが強調表示されます。
メソッドの一番左側にある数字は、直前のメソッドから呼び出されたときの、そのメソッドの包括的時間です。包括的というのは、そのメソッドと、そのメソッドから呼び出されたほかのメソッドで使用した時間を合計したもの、という意味です。パーセンテージは、そのメソッドが消費した時間の中で、指定された呼び出し側メソッドのために消費した時間が占める割合です。仮に、"200
(50%, 4 other callers) someClass.someMethod"と表示されている場合、200が総合計時間の50%ということなので、このメソッドでの包括的時間の合計は400となります。このメソッドを呼び出した他のメソッドの値も表示されます。このメソッドを呼び出しているほかのメソッドを検索する場合は、そのメソッドをダブルクリックします。他の呼び出しメソッドをシングルクリックし、[Find]ボタンをクリックします。その呼び出しメソッドは、ツリー内で強調表示されます。
一番上位のメソッド呼び出しが必要ない場合は、ツリーの大きさを縮小する方法はもう一つあります。それは新しいルートを設定することです。メソッドを強調表示させ、[Tree]メニューから[Set
as Root(s)]を選択します。これで、強調表示されたメソッドが新しいルートになり、ツリーが小さく、管理しやすくなります。選択されているメソッドよりも上位にあるメソッドはすべてビューから削除されます。もう一度ツリー全体を見たい場合は、[Tree]メニューから[Restore
Roots]を選択します。また、[Tree]メニューで[Collapse All]を選択すると、全てのツリーを折りたたむことができます。
例
このメトリクスを使用する便利な方法は、時間や呼び出し回数のメトリクスと併用する、というものです。まず、調査する必要のあるメソッドを見つけます。呼び出し回数の多いものや、クロック時間がCPU時間に比べてはるかに長いメソッドです。[Mark
to Find]を使用して、そのメソッドを他のメトリクスで見つけやすいようにします。次に[Call Graph Tree]を起動し、メソッドを探します。そのメソッドが何度呼ばれたかを調べたい場合は、そのメソッドよりも上にある、そのメソッドを呼び出しているメソッドを全て調べます。目的はこのメソッドを呼び出すメソッドの数を減らすことです。この方法で、このメソッドを呼び出しているメソッドの大半が見つかります。あるいは、そのメソッドで使っている時間を調べたい場合は、問題になっているメソッドのツリーを展開して、時間の多くを使っているメソッドをがどれかを判定します。これによって、パフォーマンスを上げるために調査するべき、速度低下の原因となっている可能性のある場所を見つけることができます。
[Thread Group Histogram]も[Metric]メニューの下にあります。このビューは、個々のスレッドだけではなく、あるアプリケーション内の異なるスレッドグループに対する割合が表示される、ということを除けばスレッドヒストグラムと同じです。ここでも、スレッドグループのいずれかをダブルクリックすると円グラフが表示されます。