NetBeans Profiler 5.5 の使用方法
完全計測と標本計測
CPU プロファイル時に、プロファイルされる各メソッドの先頭に、「メソッドに入る」呼び出しが注入され、各 return の前に「メソッドから出る」呼び出しが注入されます。これらの「メソッドに入る」/「メソッドから出る」呼び出しによってタイムスタンプが生成されます。完全計測と標本計測の違いは、計測するメソッドのタイムスタンプを取得するタイミングです。
- 完全計測モード
「メソッドに入る」と「メソッドから出る」の各呼び出しでタイムスタンプが生成され、メソッドで使われた時間がこれらのタイムスタンプの差として計算されます。
- 標本計測モード
指定した標本周期の終了付近に収まる「メソッドに入る」/「メソッドから出る」呼び出しについてのみ、タイムスタンプが取得されます。
完全計測
既定の完全計測を使用すると、「メソッドに入る」と「メソッドから出る」の両方が注入された呼び出しについて、それらが呼び出されるたびにタイムスタンプが記録されます。ターゲットアプリケーションメソッドの実行時間は 2 つのタイムスタンプの差として計算されます。これにより、ローカルで正確に測定されます。
この短所は、高分解能タイムスタンプを返す OS 呼び出しのオーバーヘッドが著しく増大することです。Solaris および Linux オペレーティングシステムを実行しているマシンでおよそ数百ナノ秒、Windows を実行しているマシンでは 1 マイクロ秒以上になります。そのため、アプリケーションに、頻繁に実行される小さなメソッド (数行のコード) が多数含まれる場合に、完全計測を使用すると、オーバーヘッドの著しい増加がみられることがあります。アプリケーションによっては、数十パーセントから数千パーセントに達します。
標本計測
標本計測は、従来の計測 (正確にメソッド呼び出し数をカウント) と従来の標本手法 (小さなオーバーヘッド) の利点を併せ持つハイブリッド方式です。この方法を使用すると、「メソッドに入る」呼び出しと「メソッドから出る」呼び出しで、呼び出し数がカウントされますが、それらが呼び出されるたびにタイムスタンプを取得しません。代わりに、Profiler によって管理され、個別の実行スレッドで、指定した期間設定されるスレッド単位のフラグがチェックされます。
スレッドのフラグが True の場合、「メソッドに入る」/「メソッドから出る」への次の呼び出しで、どちらが先であっても、タイムスタンプが取得されます。このタイムスタンプと、以前にメソッドに対して同様に記録され、現在スレッドのスタックの一番上にあるタイムスタンプの差が求められます。この方法で、OS の高精度タイマーへの呼び出し数が劇的に削減されます。
つまり、1 秒あたり 10,000 〜 1,000,000 回位の呼び出しを行うきわめて呼び出し回数の多いアプリケーションの場合、大幅なオーバーヘッドの軽減 (10 倍以上) になります。さらに、そのようなアプリケーションの場合、このプロファイル方法によって、結果の精度も増すことがあります。これは、プログラムの実行中に、JVM の動的コンパイラと CPU が適用する最適化への損失が少ない傾向があるためです。
この方法の唯一の短所は、めったに実行されないか、短時間しか実行されないメソッドの結果が正確でないことです。しかし、従来のサンプリングと異なり、少なくともこれらのメソッドの正確な呼び出し数が記録されます。
どちらの方法を選ぶか
プロファイル方法の選択については、完全計測から始めることを推奨します。オーバーヘッドが 100% 以上になることが監視された場合や呼び出しの回数が 1 万回/秒を超える場合 (通常はこの両方が組み合わされます)、標本計測に切り替えることをお勧めします。呼び出し回数の多いアプリケーションの場合、完全計測と標本計測で生成される結果がわずかに異なることがあります。この場合、上位 10 〜 20 位のメソッドについては標本計測の方が正しい結果が生成され、残りのアプリケーションコードについては、完全計測の方が正しい結果になります。
関連項目
