Насколько хорошо выполняется Scala по сравнению с Java?

Вопрос на самом деле говорит все.

Причина этого вопроса заключается в том, что я собираюсь начать небольшой проект и хочу сделать это в Scala. Я изучаю scala за последний месяц, и теперь мне комфортно работать с ним. Сам компилятор scala довольно медленный (если вы не используете fsc). Итак, насколько хорошо он работает на JVM? Раньше я работал над groovy, и я иногда видел его выше, чем java. Мой вопрос в том, насколько хорошо scala выполняет JVM по сравнению с Java. Я знаю, что Scala имеет некоторые очень хорошие функции (FP, динамический lang, статически типизированный...), но в конце дня нам нужна производительность...

Ответ 1

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

Если вам нужны некоторые данные, демонстрирующие, что Scala может быть в основном так же быстро, как Java, проверьте результаты на Компьютерная игра Benchmark Game. (Еще одно менее полезное, но все же интересное сравнение для высокопроизводительного многоядерного программирования - Tim Bray Wide Finder 2. Это менее полезно, потому что алгоритм не заранее определенный, поэтому большая часть различий сводится к различиям в алгоритме.)

Ответ 2

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

Теперь сравнение Java с Scala:

В большинстве случаев вы можете ожидать, что Scala будет наравне с Java. Scala может быть медленным, если вы программируете в нем глупо, например, тоны микширования через Traits могут обеспечить некоторые накладные расходы, которые простая Java не имела бы.

Но...

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

С другой стороны, если вы используете языковые функции без уважительной причины (например, объекты Integer, когда будут выполняться простые примитивы int), ваш код будет раздутым, медленным, дерьмом, независимо от того, какой язык вы используете.

Кроме того, рассмотрите специальный класс приложений на основе запроса-ответа, которые взаимодействуют с базой данных или другим ресурсом интенсивного ввода-вывода. Шея бутылки не будет "новым" оператором или вызовом вызова виртуального метода - это почти наверняка будет I/O.

Таким образом, производительность между Scala и Java примерно одинакова и не должна быть самой большой причиной, по которой вы выбираете одну из них в 99% случаев. Поскольку квалифицированный человеческий труд дороже, чем компьютерное оборудование, вам лучше выбрать язык, который вы можете (или можете научиться) наиболее эффективно использовать (включая своих товарищей по команде). Если Scala позволяет писать одну десятую кода в виде Java, вы можете получить 10X преимущество, используя его. Если Scala замедляет вас 10 раз (потому что слишком сложно читать), придерживайтесь Java!

Ответ 3

Я согласен с комментариями Рекса в этом сообщении, и у меня есть личный опыт его поддержки. Я преобразовал апплет обработки из java в scala, не изменяя никаких деталей реализации, и оба апплета отображали фрейм в ~ 6 мс с небольшим изменением.