Оптимизация с помощью компилятора Java
Недавно я читал эту статью .
В соответствии с этой статьей Java Compiler, то есть javac, не выполняет никакой оптимизации при генерации байт-кода. Это правда? Если да, то может ли он быть реализован как промежуточный генератор кода для удаления избыточности и генерации оптимального кода?
Ответы
Ответ 1
javac
будет делать только небольшую оптимизацию, если таковая имеется.
Дело в том, что компилятор JIT делает большую часть оптимизации - и он лучше всего работает, если у него много информации, некоторые из которых могут быть потеряны, если javac
тоже выполнял оптимизацию. Если javac
выполнил какую-то разворот цикла, для JIT было бы сложнее сделать это сам в общем виде - и у него будет больше информации о том, какие оптимизации будут действительно работать, поскольку он знает целевую платформу.
Ответ 2
Я перестал читать, когда попал в этот раздел:
Что еще более важно, компилятор javac не выполняет простые оптимизации как разворачивание цикла, алгебраическое упрощение, снижение прочности, и другие. Чтобы получить эти преимущества и другие простые оптимизации, программист должен выполнять их на Исходный код Java и не полагаться на javac для их выполнения.
Во-первых, выполнение цикла, развернутого по исходному коду Java, вряд ли будет хорошей идеей. Причина javac
не очень помогает в оптимизации, так это то, что она выполняется JIT-компилятором в JVM, что может сделать гораздо лучшие решения, которые мог бы сделать компилятор, поскольку он может видеть, какой именно код запускается больше всего.
Ответ 3
Компилятор javac
однажды поддерживал опцию генерации оптимизированного байт-кода, передавая -o
в командной строке.
Однако начиная с J2SE1.3, JVM HotSpot была отправлена с платформой, в которой были представлены динамические методы, такие как компиляция "точно в срок" и адаптивная оптимизация общего выполнения пути. Следовательно, -o
был проигнорирован компилятором Java, начиная с этой версии.
Я столкнулся с этим флагом, когда читал о Ant javac
и его атрибуте optimize
:
Указывает, должен ли источник компилироваться с оптимизацией; по умолчанию - off
. Примечание, что этот флаг просто игнорируется Sun javac
, начиная с JDK 1.3 (так как оптимизация времени компиляции не нужна).
Преимущества динамической оптимизации HotSpot JVM по оптимизации времени компиляции упоминаются в этой странице:
VM сервера содержит усовершенствованный адаптивный компилятор, который поддерживает многие из тех же типов оптимизаций, которые выполняются при оптимизации компиляторов С++, а также некоторые оптимизации, которые не могут быть выполнены традиционными компиляторами, такие как агрессивная встраивание вызовов виртуальных методов. Это конкурентное преимущество и преимущество перед статическими компиляторами. Адаптивная технология оптимизации очень гибкая в своем подходе и обычно превосходит даже продвинутые методы статического анализа и компиляции.
Ответ 4
Я изучил выведенный байт-код Java в прошлом (используя приложение под названием FrontEnd). В основном это не делает никакой оптимизации, кроме встроенных констант (статических финалов) и предварительных вычислений фиксированных выражений (например, 2 * 5 и "ab" + "cd" ). Это часть того, почему так легко разбирать (используя приложение JAD)
Я также обнаружил некоторые интересные моменты для оптимизации вашего java-кода. Это помогло мне улучшить скорость внутренних петель в 2,5 раза.
Метод имеет 5 переменных быстрого доступа. Когда эти переменные вызываются, они быстрее всех других переменных (вероятно, из-за поддержки стека). Параметры метода также учитываются для этих 5. Итак, если у вас есть код внутри цикла, который выполняется как миллион раз, выделите эти переменные в начале метода и не получите никаких параметров.
Локальные переменные также быстрее, чем поля, поэтому, если вы используете поля внутри внутренних циклов, кешируйте эти переменные, назначая их локальной переменной в начале метода. Кэшируйте ссылку, а не содержимое. (например: int [] px = this.pixels;)
Ответ 5
Чтобы оптимизировать ваш байт-код, вы можете использовать Proguard.
Как отмечали другие, JIT в основной JVM будет оптимизировать код по мере его компиляции и, поскольку он имеет доступ к большему контексту, он, вероятно, превзойдет Proguard. Это может быть не так в более простых виртуальных машинах. В Android-мире обычной практикой является использование оптимизаций Proguard при таргетинге на Dalvik (виртуальная машина, которая поставляется с Android до Lollipop).
Proguard также сжимается и обфускает байт-код, что необходимо при отправке клиентских приложений (даже если вы не используете оптимизации).
Ответ 6
Васту Шастра имеет большое значение для входной двери в дом, так как это место, откуда энергии, положительные или отрицательные, входят и выходят из дома. Сказав это, очевидно, что если больше отрицательных энергий входит в дом от главной двери, то люди в доме не будут процветать. Vastu для домашнего входа