Скорость компиляции Java против скорости компиляции Scala - PullRequest
97 голосов
/ 16 августа 2010

Я давно программирую в Scala, и мне это нравится, но меня раздражает одна вещь - время, необходимое для компиляции программ. Это кажется мелочью, но с помощью Java я мог бы внести небольшие изменения в свою программу, щелкнуть кнопку запуска в NetBeans и запустить BOOM, и со временем компиляция в Scala, похоже, отнимает много времени. Я слышал, что во многих крупных проектах язык сценариев становится очень важным из-за того, что на компиляцию уходит много времени, что не возникало при использовании Java.

Но я пришел из Java, которая, насколько я понимаю, быстрее, чем любой другой скомпилированный язык, и работает быстро по причинам, по которым я переключился на Scala (это очень простой язык).

Итак, я хотел спросить, могу ли я сделать компиляцию Scala быстрее и будет ли Scalac работать так же быстро, как javac.

Ответы [ 8 ]

449 голосов
/ 31 августа 2010

У компилятора Scala (отсутствие) скорости есть два аспекта.

  1. Большие накладные расходы при запуске

    • Сам Scalac состоит из множества классов, которые должны быть загружены и скомпилированы в формате jit

    • Scalac должен найти путь к классу для всех корневых пакетов и файлов. В зависимости от размера вашего classpath это может занять от одной до трех дополнительных секунд.

    В целом ожидайте, что издержки запуска скаляка будут 4-8 секунд, дольше, если вы запустите его в первый раз, чтобы дисковые кеши не были заполнены.

    Ответ Scala на накладные расходы на запуск - либо использовать fsc, либо выполнять непрерывное построение с помощью sbt. IntelliJ должен быть настроен на использование любого из этих вариантов, в противном случае его издержки даже для небольших файлов неоправданно велики.

  2. Более медленная скорость компиляции. Скалак обрабатывает от 500 до 1000 строк / сек. Javac справляется примерно в 10 раз. Для этого есть несколько причин.

    • Вывод типа является дорогостоящим, особенно если он включает неявный поиск.

    • Scalac должен выполнить проверку типа дважды; один раз в соответствии с правилами Scala и второй раз после стирания в соответствии с правилами Java.

    • Помимо проверки типов, существует около 15 шагов преобразования из Scala в Java, которые все требуют времени.

      1036 **
    • Как правило, Scala генерирует гораздо больше классов для каждого размера файла, чем Java, особенно если интенсивно используются функциональные идиомы. Генерация байт-кода и запись класса занимает время.

    С другой стороны, 1000-строчная Scala-программа может соответствовать Java-программе на 2-3 Кбайта, поэтому некоторая медленная скорость при подсчете в строках в секунду должна быть сбалансирована с большей функциональностью на строку.

    Мы работаем над улучшением скорости (например, параллельно генерируя файлы классов), но на этом фронте чудес не предвидится. Скалак никогда не будет так быстр, как Джавак. Я считаю, что решение будет лежать на серверах компиляции, таких как fsc, в сочетании с хорошим анализом зависимостей, так что нужно будет перекомпилировать только минимальный набор файлов. Мы тоже над этим работаем.

55 голосов
/ 16 августа 2010

Компилятор Scala более сложен, чем Java, обеспечивая вывод типов, неявное преобразование и гораздо более мощную систему типов. Эти функции не предоставляются бесплатно, поэтому я бы не ожидал, что Scalac будет настолько быстрым, как Javac. Это отражает компромисс между программистом, выполняющим работу, и компилятором, выполняющим работу.

Тем не менее, время компиляции уже заметно улучшилось с Scala 2.7 до Scala 2.8, и я ожидаю, что улучшения продолжатся и сейчас, когда пыль осела на 2.8. На этой странице описаны некоторые текущие усилия и идеи по улучшению производительности компилятора Scala.

Мартин Одерский приводит гораздо более подробную информацию в своем ответе.

40 голосов
/ 31 августа 2010

Вы должны знать, что компиляция Scala занимает как минимум на порядок больше, чем Java.Причины этого следующие:

  1. Соглашения об именах (файл XY.scala не обязательно должен содержать класс с именем XY и может содержать несколько классов верхнего уровня). Поэтому компилятору, возможно, придется искать больше исходных файлов, чтобы найти заданный идентификатор класса / признака / объекта.
  2. Implicits - интенсивное использование implicits означает, что компилятору нужно искать любой неявный в области видимостипреобразование для данного метода и ранжировать их, чтобы найти «правильный».( т.е. компилятор имеет значительно увеличенную область поиска при поиске метода. )
  3. Система типов - система типов Scala намного сложнее, чем Java, и, следовательно, занимает больше процессорного времени.
  4. Вывод типа - вывод типа является вычислительно дорогим, и работа, которую javac вообще не требуется выполнять
  5. scalac включает 8-битный симулятор полностью вооруженного и боевого действия.станция, которую можно просмотреть с помощью комбинации магических клавиш CTRL-ALT-F12 на этапе компиляции GenICode .
19 голосов
/ 31 августа 2010

Лучший способ сделать Scala - это IDEA и SBT. Настройте элементарный проект SBT (который он вам сделает, если хотите) и запустите его в режиме автоматической компиляции (команда ~compile), а когда вы сохраните свой проект, SBT перекомпилирует его.

Вы также можете использовать плагин SBT для IDEA и прикрепить действие SBT к каждой из ваших конфигураций запуска. Плагин SBT также предоставляет интерактивную консоль SBT в IDEA.

В любом случае (SBT работает извне или подключаемый модуль SBT), SBT остается работающим, и, таким образом, все классы, используемые при создании вашего проекта, «прогреваются» и подвергаются JIT-обработке, а накладные расходы на запуск устраняются. Кроме того, SBT компилирует только те исходные файлы, которые в этом нуждаются. На сегодняшний день это самый эффективный способ создания программ Scala.

8 голосов
/ 16 августа 2010

Последние версии Scala-IDE (Eclipse) намного лучше справляются с инкрементальной компиляцией.

См. " Какая система сборки Scala лучшая? " для получения дополнительной информации.


Другое решение заключается в интеграции fsc - быстрого автономного компилятора для языка Scala 2 - (как показано в этом сообщении в блоге ) в качестве компоновщикав вашей IDE.

alt text

Но не в напрямую Затмение, хотя, как Даниэль Спивак упоминает в комментариях:

Вы не должны использовать FSC в Eclipse напрямую, хотя бы потому, что Eclipse уже использует FSC под поверхностью.
FSC - это, по сути, тонкий слой поверх резидентного компилятора, который является именно тем механизмом, который используетсяЗатмение для компиляции проектов Scala.


Наконец, как Джексон Дэвис напоминает мне в комментариях:

sbt (Simple build Tool) также включает некоторую «инкрементную» компиляцию (через Триггерное выполнение ), хотя оно не идеально , и улучшенная инкрементная компиляция находится в работе для будущей версии 0,9 сБт.

6 голосов
/ 16 августа 2010

Использовать fsc - это быстрый компилятор scala, который выполняет роль фоновой задачи и не требует постоянной загрузки. Может повторно использовать предыдущий экземпляр компилятора.

Я не уверен, что плагин Netbeans Scala поддерживает fsc (так написано в документации), но я не смог заставить его работать. Попробуйте ночные сборки плагина.

3 голосов
/ 09 декабря 2012

Вы можете использовать плагин JRebel, который бесплатен для Scala.Таким образом, вы можете «развиваться в отладчике», и JRebel всегда перезагрузит измененный класс на месте.

Я читал какое-то утверждение самого Мартина Одерского, где он говорит, что поиск имплицитов (компилятор должен убедиться, что не одно и то же неявное выражение для одного и того же преобразования исключает неоднозначности) может сохранитьКомпилятор занят.Поэтому было бы неплохо с осторожностью обращаться с импликациями.

Если это не должно быть 100% Scala, но и что-то подобное, вы можете попробовать Kotlin .

- Оливер

2 голосов
/ 16 августа 2010

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

Уделите время более тщательному мышлению и выполняйте меньше микроциклов разработки. Хороший код Scala является более плотным и более важным (то есть свободным от случайных деталей и сложности). Это требует больше размышлений, и это требует времени (по крайней мере, на первый взгляд). Вы можете прогрессировать с меньшим количеством циклов кода / тестирования / отладки, которые по отдельности немного длиннее и все же повышают производительность и качество вашей работы.

Вкратце: ищите оптимальный рабочий режим, лучше подходящий для Scala.

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