Есть ли разница в производительности между включенной и выключенной отладкой Javac?

Если я включу создание отладочной информации с помощью Javac, файлы классов будут на 20-25% больше. Влияет ли это на производительность при запуске программы Java? Если да, то на каких условиях и в каком количестве. Я ожидаю небольшого влияния на загрузку классов, потому что файлы больше, но это должно быть минимальным.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
60
0
18 362
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

На любом языке отладочная информация - это метаинформация. Он по своей природе увеличивает размер объектных файлов, тем самым увеличивая время загрузки. Во время выполнения вне отладчика эта информация фактически полностью игнорируется. Как указано (хотя и не ясно) в Спецификация JVM, отладочная информация хранится вне потока байт-кода. Это означает, что во время выполнения в файле класса нет никакой разницы. Если вы хотите быть уверенным, попробуйте :-).

Пс. Часто для отладки имеет смысл отключить оптимизацию. Это делает влияет на производительность.

У javac все еще есть -O? Последнее, что я помню, это был эквивалент -g: none.

Tom Hawtin - tackline 20.10.2008 16:33

Правильный. Это влияет на время загрузки, но не на время выполнения.

kohlerm 20.10.2008 17:16

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

Paul de Vrieze 02.01.2010 23:05
Сколько влияет на размер и время загрузки? Есть ли результаты выполненных тестов, на которые мы можем посмотреть?
Martin 29.12.2014 21:35

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

Но пока что компромисс между получением смысла полных трассировок стека или большей производительностью для пользователя, я всегда голосовал за трассировки стека. В конце концов, пользователи готовы тратить 1000 долларов в год на получение более быстрой машины, но не готовы тратить 15 минут на то, чтобы дать вам содержательные сообщения об ошибках для решения их проблем.

Спустя годы я с большей готовностью буду ценить свои 15 минут выше, чем 1000 $ пользователя. :)

Имейте в виду, что поскольку JDK1.3 javac игнорирует любые флаги оптимизации, «оптимизация времени компиляции не требуется»

Другие вопросы по теме