Оптимизация с помощью компилятора 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 для домашнего входа