Почему компиляция очень медленная для программ Scala?

Я использую Scala за последние два месяца. Я также использую Play Framework для небольшого приложения. Я заметил, что компиляция выполняется очень медленно даже для программы для печати "Hello World". Почему это так медленно? Есть ли советы по сокращению времени?

Ответ 1

Как быстро компиляция в вашем случае?

скорость скаляса ограничена двумя факторами:

  • Это довольно большая программа, которая работает на JVM. Таким образом, время запуска не очень велико, потому что нужно (1) запустить в него сканер JVM (2) (3) JIT компилирует большую часть его, чтобы получить скорость. Время запуска 2-4 секунды типично, и первые пары скачков не очень быстры. Если ваша установка правильная, это будет уменьшено, если скаляр будет оставаться резидентным и "теплым" в запущенной JVM. sbt делает это, как и все IDE. Я рекомендую использовать один из этих параметров, иначе, если вы должны скомпилировать из командной строки, используйте "fsc", который также сохраняет резидентный компилятор. (Например, люди обычно не жалуются на скорость REPL, но REPL использует тот же самый скаляр, что и все остальные. Разница только в том, что компилятор поддерживается резидентным).

  • Даже полностью разогретый скалак должен бороться с программами, которые иногда требуют сложного вывода типа. Таким образом, это не так быстро, как компиляторы для языков с очень простыми типами систем, таких как Go. Я вижу на своем 3-летнем Macbook Pro скорость компиляции 500-800 строк в секунду. Это не удаляет мировой рекорд, но этого достаточно для инкрементной компиляции, что и делают IDE и sbt. Мой текущий проект составляет около 50 тыс. Строк кода, но я в принципе никогда не жду компилятора в своей среде IDE (Scala IDE для Eclipse), потому что инкрементная компиляция выполняется достаточно быстро. Некоторые люди видят скорость компиляции, которая ниже. Это обычно потому, что они используют конструкции (часто импортируемые из библиотеки), которые очень дороги для компиляции, такие как сложные неявные иерархии параметров.

Ответ 2

Ну, это своего рода дублированный вопрос, но поскольку он содержит другую, более практичную часть, я постараюсь дать ответ тем не менее.

Прежде всего: компиляция медленная, потому что язык богат функциями. Конечно, есть примеры, когда языки с примерно одинаковым набором функций компилируются быстрее, но у нас есть то, что у нас есть. Первые несколько моментов, которые мне приходят в голову:

  • вывод типа
  • неявное разрешение
  • расширение макроса
  • программирование на уровне уровня, что приводит к огромному количеству конкретных (анонимных классов), которые все должны быть учтены
  • ...

Для более подробного ответа я отсылаю вас к Scala creator Dr. Сам Одерский:.

Что касается второй части вашего вопроса, это зависит от того, как вы компилируете:

Я думаю, что в вашем случае использование Activator - лучший выбор, поскольку вы уже используете Play. Но помните, что это не серебряная пуля: вы все равно получаете медленную компиляцию в первый раз, а скорость последующих запусков зависит от того, сколько изменений вы внесли в код.

А, а также аппаратная сторона. Само собой разумеется, что мощный процессор, достаточное количество оперативной памяти и быстрый (предпочтительно SSD) диск, безусловно, уменьшат скорость компиляции.