Количество вызовов в профилях netbeans

Когда я использую профилировщик в NetBeans 7.1, я не вижу ожидаемого номера вызова для своих методов.

Чтобы проверить это, я создал простую программу с тремя методами, каждый из которых вызывается десять тысяч раз.

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 вызовов для каждого метода в моем моментальном снимке профилировщика, который я делаю в конце профилирования. Однако результаты, которые я получаю, дают значительно меньшее количество вызовов для каждого метода, и они также различаются для каждого из трех методов.

Мне любопытно, что вызывает это, и как можно получить фактическое количество вызовов для каждого метода.

Вот скриншот результатов:

введите здесь описание изображения

Я еще немного покопался и нашел этот отчет об ошибке, в котором говорится о встроенных методах. и встраивание методов в компилятор java hotspot. Предлагаемое исправление заключается в использовании опции -Xint для jdk1.6. Однако в JDK 1.7 это не меняет моих результатов.


person quodlibet    schedule 08.06.2012    source источник
comment
Я до сих пор не знаю, почему это происходит. У кого-нибудь есть идея?   -  person quodlibet    schedule 24.10.2012


Ответы (1)


Если вы используете выборочный режим, это ожидаемо. Профилировщик использует выборку стека для оценки количества входов/выходов для каждого метода, а также продолжительности этого конкретного метода.

Из-за выборки номера вызовов в некоторых случаях могут быть полностью отключены - например, запуск очень коротких методов очень много раз в цикле. Например. когда 5 семплов последовательно попадают в короткий метод, являющийся вершиной стека, это будет считаться одним вызовом, потому что из POV сэмплера короткий метод никогда не завершался.

Временные данные намного точнее при дискретизации — единственным разделителем является частота дискретизации.

Если вы хотите получить точное количество вызовов, переключитесь в инструментальный режим профилирования. В противном случае вам нужно воспринимать выборочные вызовы с долей скептицизма.

person JB-    schedule 07.03.2013