Почему leiningen так медленно, когда он начинается?

Я использую lein repl для выполнения clojure repl в консоли. Когда я запускаю его, он занимает более 15 секунд. Когда я запускаю java -cp clojure-1.6.0.jar clojure.main, это занимает всего несколько секунд.

Почему lein repl так медленно? Есть ли способ сделать это быстрее?

Моя env:

  • H/W: MacBookAir
  • O/S: Mac OS 10.9 Mavericks
  • CPU: i7
  • MEM: 8GB

Ответ 1

Leiningen запускает два JVM и соединяет их вместе. Для этого нужно было загрузить дополнительные вещи. Приглашение, которое вы вводите, - это другой процесс из процесса Clojure, который оценивает ваш код. Leiningen также должен разбирать ваш файл проекта и следить за тем, чтобы все было настроено по мере необходимости, или заходите и получаете то, что нужно от Интернета, если в вашем каталоге конфигурации maven отсутствует что-либо. В пример файла проекта Leiningen есть несколько вариантов, которые могут немного ускорить работу, если вы внимательно прочитаете это. Я думаю, что Лейнинген с медленным запуском - это лишь один из фактов жизни прямо сейчас.

Дополнительная информация:

Улучшение времени запуска Clojure REPL с Leiningen на малине Pi

Faster

Ответ 2

Если вы запустите lein repl из каталога проекта, он загрузит исходные файлы проекта в дополнение к запуску repl. Даже для небольшого проекта это может добавить значительное время, если исходные файлы ссылаются на внешние зависимости.

java -cp clojure-1.6.0.jar clojure.main не будет загружать исходные файлы проекта или зависимости.

Ответ 4

На ваш первый вопрос был дан ответ, поэтому в отношении второго я предполагаю, что вы хотите уменьшить время загрузки, потому что вы обычно загружаете некоторые пространства имен, которые меняются при кодировании. Возможно перезагрузить код из измененного пространства имен без выхода из REPL с помощью (use 'your.namespace :reload). Таким образом, вы можете загрузиться только один раз и перезагрузить обновленные пространства имен

user=> (doc require)

...

  :reload forces loading of all the identified libs even if they are already loaded
  :reload-all implies :reload and also forces loading of all libs that the identified libs directly or indirectly load via require or use

...

С другой стороны, если вы прочитаете вывод lein help repl, вы увидите, как настроить сервер REPL и клиент, который может сократить время загрузки.

Ответ 5

В моем случае это был плагин cider-nrepl, который значительно повлиял на время загрузки.

Быстрое ненасильственное исследование с помощью jvisualvm показало, что большое количество времени идет на загрузку и оценку файлов (0.10-моментальный снимок не AOT-ed), а также была инициализационная логика, которая сканирует путь к классам.

Использование быстрых батутов сократило время запуска.

jvm играет не большую роль, чем ОС или файловая система, на мой взгляд. Все о загружаемом коде.