Java compilers performance
Рубрика: Java | 11 December 2007, 12:04 |
Vadim Voituk
Очевидно что производительность любого разработчика не в последнюю очередь зависти от скорости работы инструментальных средств, которые он использует.
Это и производительность используемой IDE, и скорость работы компилятора, сценариев сборки и развертывания приложения, и тд.
Потому предлагаю беглое сравнение скорости работы популярных Java-компиляторов.
IBM jikes
Сайт проекта: jikes.sourceforge.net
Проприетарная разработка IBM, которая только недавно стала open source.
При компиляции, jikes определяет “подозрительный” код и выводит предложения по улучшению, основываясь на книге Joshua Bloch “Effective Java Programming Language Guide”.
Кроме того, это единственный, из выбранных для тестирования компиляторов, который написан не на Java.
Из минусов можно отметить, что последний релиз jikes был в ноябре 2004 г (тоесть более 3х лет назад), а также необходимость при компиляции указывать кодировку, к которой записан исходный код.
Тем не менее он полностью поддерживает все возможности Java 5 Tiger.
Sun javac
Сайт проекта: java.sun.com
Самый популярный и часто используемый компилятор, часть SUN JDK – в представлении не нуждается.
Eclipse Java Compiler
Сайт проекта: eclipse.org
Инкрементный компилятор, позволяет собирать проект, даже если некоторые его классы ещё не компилируются.
Является частью популярной Java IDE Eclipse и был построен на технологиях, полученных от IBM-овского проекта VisualAge for Java Compiler
Так же как и jikes, в процессе компиляции по умолчанию выводятся warning-и аналогичные тем, что можно видеть в самом Eclipse Java IDE.
Для тестирования скорости компиляции взял исходный код RegExp из проекта Jakarta.
Компиляцию проводил с указанием целевой платформы Java 5.
Перед каждым тестированием удалял уже скомпилированные файлы.
Запуск и замеры времени проводил утилитой time под cygwin:
bash-3.2$ time jikes --source cp1251 --target 1.5 *.java
bash-3.2$ time javac *.java
bash-3.2$ time java \
-classpath D:/Eclipse/plugins/org.eclipse.jdt.core_3.3.0.v_708.jar \
org.eclipse.jdt.internal.compiler.batch.Main -classpath "$CLASSPATH" *.java
Результаты можно увидеть на диаграмме:

Даже отняв от времени компиляции секунду-полторы, которую javac и eclipse тратят на запуск и инициализацию JVM – самым производительным оказался jikes.
Перед тем как писать этот мини-обзор, наткнулся на сообщение в одном и maillists, автор которого активно восхвалял производительность eclipse compiler, аргументируя это тем, что тот “даже быстрее jikes”.
Мои же тесты, как видно, этого не подтверждают :)
Также не совсем ясно почему, но хваленный eclipse-овский инкрементный компилятор не показывал прироста в скорости компиляции даже в том случае, когда часть классов уже были скомпилированы.

ну с jikes все понятно. нативный компилятор есть нативный компилятор, что тут еще говорить. насчет компилятора Eclipse, сдается мне, что он таки пересобирает все классы заново при компиляции, т.е. не отслеживает что было скомпилировано, а что нет. хотя я конечно могу ошибаться, я не большой поклонник Eclipse.
спасибо за статью, очень интересная информация.
Антон,
“Нативное” приложение выигрывает только во времени, затраченном на запуск JVM и HotSpot-компиляцию классов. На моей машине на это уходит порядка секунды-полторы.
Так что я не очень склонен считать что скорость работы jikes обусловлена только его “нативностью”
Насчет же Eclipse – скорее всего при его использовании, за определение необходимости перекомпилирования class-файла отвечает уже клиент класса компилятора, например IDE.
Хотя я в этом не уверен – всего-лишь IMHO.
P.S. Где-то читал, что некоторые используют Eclipse Java Compiler в IDEA :)
Вадим, позволю не согласиться. выигрыш не только на время запуска JVM и HotSpot-компиляцию, еще экономится время на системных вызовах, которые в нативном компиляторе делаются напрямую, а не посредством JVM. так что врядли jikes преставляет собой какую-то уникальную разработку — просто хороший нативный комилятор. хотя всякое может быть.