2

NetBeans 7.1でプロファイラーを使用すると、メソッドの予期される呼び出し番号が表示されません。

これをテストするために、それぞれ 1 万回呼び出される 3 つのメソッドを持つ単純なプログラムを作成しました。

public class profilerTest {
    static int one;
    static int two;
    static int three;

    public static void main(String args[]) {
        for (int i = 0 ;i<= 10000; i++)one();
    }

    public static void one() {
        System.out.println("one:" + one++);
        two();
    }

    public static void two() {
        System.out.println("two:" + two++);
        three();
    }

    public static void three() {  
        System.out.println("three:" + three++);
    }
}

プロファイリングの最後に取得したプロファイラー スナップショットでは、メソッドごとに 10000 回の呼び出しが見られると予想しています。ただし、得られた結果は、各メソッドの呼び出し数が大幅に少なく、3 つのメソッドごとに異なります。

これを引き起こしている原因と、各メソッドの実際の呼び出し回数を取得できるかどうか、およびその方法に興味があります。

結果のスクリーンショットを次に示します。

ここに画像の説明を入力

私はさらに掘り下げて、Java hotspot コンパイラーの組み込みメソッドとメソッドのインライン化について説明しているこのバグ・レポートを見つけました。推奨される修正は、jdk1.6 に -Xint オプションを使用することです。ただし、JDK 1.7 では、結果は変わりません。

4

1 に答える 1

1

サンプリング モードを使用している場合、これは予期されることです。プロファイラーは、スタック サンプリングを使用して、各メソッドの開始/終了の数と、その特定のメソッドの継続時間を推定します。

サンプリングにより、場合によっては呼び出し回数が完全にずれることがあります。たとえば、非常に短いメソッドをループで何度も実行する場合などです。例えば。5 つのサンプルがスタックの一番上にあるショート メソッドに連続してヒットすると、サンプラーの POV からショート メソッドが終了しないため、1 回の呼び出しとしてカウントされます。

時間データは、サンプリングではるかに正確です。唯一の区切り文字はサンプリング周波数です。

正確な呼び出し回数が必要な場合は、インストルメント化されたプロファイリング モードに切り替えます。それ以外の場合は、サンプリングされた呼び出しを一粒の塩で取る必要があります。

于 2013-03-07T23:10:01.910 に答える