Мне было интересно, почему компилятор JVM JIT игнорирует "огромные методы" из компиляции. (Если для флага DontCompileHugeMethods
установлено значение false). В то же время большинство разговоров о компиляторе Java JIT указывают, что inlining - это оптимизация uber, так как позволяет увеличить массу инструкций, подлежащих компиляции. И этот более крупный контекст компиляции позволяет лучше оптимизировать исполняемый код. При этом я бы предположил, что огромный метод не сильно отличается от сильно встроенного метода и должен стать отличной мишенью для компиляции JIT. Что мне здесь не хватает?
В чем смысл JIT не компилировать огромные методы?
Ответ 1
По сути, рентабельность компиляции огромных методов низкая.
Горячие фрагменты кода обычно короткие.
Даже если часто выполняется огромный метод, горячая часть вряд ли охватит весь метод. Например. рассмотрим большой оператор
switch
, где часто выполняется только несколько метокcase
. Однако модуль компиляции - это метод, поэтому большая часть кода JITted будет пустой тратой.Компиляция огромных методов занимает много времени и места. Более того, время компиляции не растет линейно. Вместо этого было бы выгоднее скомпилировать несколько небольших методов.
Слишком длинный лист машинного кода загрязняет кэш инструкций.
Определенные оптимизации лучше применять к меньшим частям кода, например Распределение регистра или развертывание цикла.
Если один метод больше 8K байт-кодов, он все равно плохо написан.
Ответ 2
Th 8k предел, вероятно, просто устаревшая эвристика. В прежние времена [ТМ] JITing был несколько дорогостоящим (особенно если смотреть с точки зрения отзывчивости). На самом деле, наиболее интересные оптимизации (например, свертывание констант, хорошее распределение регистров и т.д.) Являются суперлинейными. Следовательно, вы хотите быть особенно осторожными, чтобы не останавливать весь процесс на полсекунды для запуска задачи оптимизации, которая может дать лишь часть этого времени в виде увеличения производительности.
Тем не менее, я полагаю, что благодаря растущему опыту, более быстрым процессорам и лучшим JIT-технологиям, предел может быть несколько увеличен (возможно, даже на порядок), но основная проблема суперлинейной производительности остается, как и предел.