Clojure производительность запуска приложения - PullRequest
19 голосов
/ 16 мая 2011

Я написал несколько небольших служебных приложений в Clojure, которые я компилирую в автономные исполняемые файлы JAR («uberjars»), используя Maven и maven-shade-plugin. Эти uberjars содержат распакованные версии clojure.jar и других библиотек (например, commons-cli), от которых зависит приложение. Они удобны тем, что я могу отправить их клиенту, не требуя от него установки Clojure (все клиенты уже установили JRE).

Я обнаружил, что запуск приложений Clojure занимает несколько секунд, тогда как аналогичные приложения, написанные на Java, запускаются за доли секунды на тех же компьютерах (например, время, чтобы показать сообщение об использовании).

Я подозреваю, что это потому, что Clojure на лету компилирует некоторый код в библиотеке clojure.core, поскольку в файле clojure.jar есть исходный код (.clj файлы).

Есть ли способ предварительно скомпилировать этот исходный код? Можно ли что-то еще сделать, чтобы ускорить производительность при запуске? Я слышал жалобы от клиентов о том, сколько времени занимает запуск (и они не знают или не заботятся о том, что приложение написано на Clojure, Java или Foobar).

Ответы [ 3 ]

4 голосов
/ 16 мая 2011

JVM (по крайней мере, Oracle HotSpot) делает очень сложную вещь, чтобы сократить время запуска. Он не загружает в память все классы и методы программы, он загружает только те ресурсы, в которых он нуждается сейчас . Для отображения сообщения об использовании или чего-то в этом роде не так много кода, поэтому фактически загружаются лишь несколько функций и программа Java запускается быстро. Более того, HotSpot даже не компилирует этих нескольких функций - он использует JIT-компиляцию (и другую оптимизацию) для кода, который выполняется многократно. Нет причин тратить время на компиляцию функций, которые будут выполняться только один раз, например почти все методы запуска, а HotSpot нет.

Итак, что насчет Clojure? Я не думаю, что вы хотели бы переписать ядро ​​Clojure, чтобы добавить аналогичную функциональность. Тем не менее, вы можете использовать тот же подход внутри вашего кода Clojure. Вы сказали, что ваши утилиты используют несколько библиотек, которые могут замедлить запуск. Итак, загружает библиотеки столько, сколько вы можете. Например, вы можете исключить опцию :use из вашего определения пространства имен и вместо этого вызвать явный use в ваших основных функциях. Это не сократит общее время, но сместит dalay к тому моменту, когда это не так заметно. Вы даже можете написать небольшую часть вашей программы на Java и вызывать код Clojure только тогда, когда это действительно необходимо.

3 голосов
/ 16 мая 2011

На сайте Clojure есть хорошее описание компиляции AOT . Это уже сбьет время запуска.

Редактировать : были предприняты некоторые попытки запустить программы Clojure на постоянной JVM, что позволило сократить время запуска Жаркий взгляд + JVM. Однако сайт, похоже, исчез: (

1 голос
/ 26 мая 2011

Конечно, есть также аргумент java -client JVM для повышения производительности запуска JVM. Этот ТАК вопрос подробно описывает эту тему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...