Профилирование Java - Насколько надежны эти значения? - PullRequest
7 голосов
/ 17 января 2010

Я работаю над простой текстовой разметкой Java Library , которая, среди прочих требований, должна быть быстрой.

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

Итак, мой вопрос - Насколько надежно профилирование? Дает ли это только информационное соотношение времени, потраченного на методы? Принимает ли это во внимание компилятор JIT или только режим профилирования интерпретируется? Я использую NetBeans Profiler и Sun JDK 1.6.

Спасибо.

Ответы [ 6 ]

5 голосов
/ 17 января 2010

При выполнении профилирования вы всегда будете подвергаться снижению производительности, поскольку что-то должно измерять время запуска / остановки методов, отслеживать объекты кучи (для профилирования памяти), поэтому возникают накладные расходы на управление.

Однако, это даст вам четкие указатели, чтобы узнать, где находятся узкие места. Я склонен искать методы, в которых тратится наибольшее совокупное время, и проверять, возможна ли оптимизация. Также полезно определить, не вызваны ли методы излишне.

С очень маленькими методами, примите результаты профиля с щепоткой соли, иногда процесс измерения может занять больше времени, чем сам вызов метода, и исказить результаты (может показаться, что маленький, часто вызываемый метод оказывает большее влияние на производительность).

Надеюсь, это поможет.

2 голосов
/ 17 января 2010

Профилирование не должно влиять на JIT-компилятор. Однако код, вставленный для профилирования вашего приложения, несколько замедлит методы.
Профилировщики работают над несколькими разными моделями, либо вставляют код, чтобы узнать, как долго и как часто выполняются методы, либо они берут выборки только путем многократного опроса, какой код выполняется в настоящее время. Первый из них немного замедлит ваш код, а второй не будет на 100% точным, поскольку может пропустить вызов некоторых методов.

2 голосов
/ 17 января 2010

Меня не удивляет тот факт, что вы получаете худшие результаты при профилировании вашего приложения, поскольку инструментарий Java-кода обычно всегда замедляет его выполнение. На самом деле это хорошо отражено на странице Википедии на Профилирование , где упоминается, что инструментарий может вызвать изменения в производительности программы, потенциально вызывая неточные неточные результаты и heisenbugs (из-за эффекта наблюдателя : наблюдатели влияют на то, что они наблюдают, просто актом наблюдения только одного ).

Сказав это, если вы хотите измерить скорость, я думаю, что вы не используете правильный инструмент. Профилировщики используются для нахождения узких мест в приложении (и для этого вас не волнует общее влияние). Но если вы хотите протестировать свою библиотеку, вам следует использовать инструмент тестирования производительности (например, что-то вроде JMeter ), который сможет дать вам среднее время выполнения на вызов. При правильном инструменте вы получите намного лучшие и более надежные результаты.

2 голосов
/ 17 января 2010

Из-за инструментария профилированный код в среднем будет работать медленнее, чем непрофилированный код. Однако измерение скорости не является целью профилирования.

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

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

Профилировщик не будет решением для стиля кодирования, который на x% медленнее оптимального, однако вам все равно нужно потратить время на тонкую настройку тех частей кода, которые используются чаще других.

1 голос
/ 17 января 2010

Я обнаружил, что получаю разные результаты в зависимости от того, какой профилировщик я использую. Однако результаты часто являются достоверными, но с другой точки зрения на проблему. При профилировании использования процессора я часто делаю так, чтобы включить профилирование распределения памяти. Это часто дает мне разные результаты процессора (из-за увеличенных накладных расходов, вызванных профилированием памяти) и может дать мне несколько полезных мест для оптимизации.

1 голос
/ 17 января 2010

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

...