2016-05-02 2 views
1

Я регулярно просматриваю высокопроизводительную Java-программу моей команды, так как неэффективные функции могут привести к серьезным замедлениям. Чтобы сделать это, я держать порт открытым для присоединения Java VisualVM, используя следующие аргументы машины Java:Выполняет ли профилирование на Java собственные проблемы с производительностью?

-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9011 -Dcom.sun.management.jmxremote.local.only=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=localhost

сегодня Это меня поразило: делает профилирование программы Java - или просто держать порт открытым ради профилирования - ввести дополнительные сокращения скорости? Если это так, некоторые методы профилирования более дорогостоящие, чем другие? Какое снижение скорости или накладные расходы - например, 1% времени выполнения, 10% времени выполнения - нормально ожидать?

В то время как мой вопрос предназначен для более широкой аудитории Java, я хочу отметить, что наша программа a - это память, но интенсивно используемая в CPU симуляция: в частности, существует огромное количество небольших, но дорогостоящих вызовов функций, , Возможно, оптимизация в нашем случае стоит дорого, учитывая огромное количество вызовов функций, но тем более для других?

+2

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

+0

Оценки любого стадиона? <10%? <3%? Я ценю, что есть много факторов, но если в большинстве случаев это незначительно, то я не потеряю сон над ним. :) –

+1

Хорошо, что вы профилируете. Тем не менее, когда я слышу, что люди ищут «неэффективные» или «медленные» функции, я обеспокоен тем, что по моему опыту реальные проблемы с производительностью не принимают эту форму. Они берут [* более обобщенную форму *] (http://stackoverflow.com/a/927773/23771), связанный с * почему * время расходуется, а не * где *. Мышление только времени, проведенного подпрограммами, не раскрывает их. –

ответ

2

делает профилирование программы Java

Около 10% - 30% в зависимости от того, что вы делаете.

или просто держать порт открытым для профилирования

Вероятно, почти нет накладных расходов.

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

Я бы серьезно рассмотрел FlightRecorder (от Java 7, лучше на Java 8). Это намного ниже накладных расходов, и имеет намного больше информации о записи ЦП. В Java 8 вы можете запустить его без добавления аргументов командной строки.

+1

Отлично! Я не понимал, что FlightRecorder может сделать это без аргументов командной строки, и я не знаю, что это было более эффективно. Это облегчит мою жизнь и в других отношениях (портовые конфликты). Благодаря! –

+0

@ DylanKnowles для профилирования процессора и памяти, Flight Recorder превосходно и встроен. –

+0

Может ли он использовать метод синхронизации? (Например, метод A занимает 30% времени выполнения, метод B составляет 10% и т. Д.). Я не могу найти способ сделать это, но, возможно, я просто его не вижу. –

 Смежные вопросы

  • Нет связанных вопросов^_^