Подтвердить что ты не робот

Производительность Haskell против JVM

Я хочу написать бэкэнд-систему для веб-сайта (это будет обычная служба стиля поиска). Он должен быть очень быстрым и быстрым. Учитывая мое желание для concurrency, я планировал использовать функциональный язык, такой как Haskell или Scala.

Однако скорость также является приоритетом. http://benchmarksgame.alioth.debian.org результаты показывают, что Java почти так же быстро, как C/С++, Scala в целом довольно хорош, но Haskell варьируется от более медленного для большинства задач намного медленнее.

Есть ли у кого-нибудь тесты производительности/опыт использования Haskell vs Scala против Java для выполнения высококонкурентных задач?

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

Зачем мне писать свою услугу или что я должен учитывать, прежде чем выбирать (производительность и concurrency являются наивысшими приоритетами)?

Спасибо

4b9b3361

Ответ 1

Этот вопрос поверхностно связан с производительностью кода, скомпилированного с кодом GHC и кодом, запущенным на JVM. Но есть много других факторов, которые вступают в игру.

Люди

  • Есть ли команда, работающая над этим, или только вы?
    • Насколько хорошо знакома/удобна эта команда с этими языками?
    • Это язык, на котором вы (все) хотите инвестировать время в обучение?
  • Кто сохранит его?

Поведение

  • Как долго ожидается, что этот проект будет жить?
  • Когда, если когда-либо, время простоя приемлемо?
  • Какую обработку будет выполнять эта программа?
    • Существуют ли хорошо известные библиотеки, которые могут вам помочь?
    • Готовы ли вы перевернуть свою собственную библиотеку? Насколько сложно было бы на этом языке?

Основной

  • Сколько вы планируете делать из открытого источника?
  • Сколько вы планируете внести в открытый исходный код?
  • Насколько живым и полезным является сообщество
    • в StackOverflow
    • on irc
    • в Reddit
    • работает с компонентами с открытым исходным кодом, которые вы можете использовать

Инструменты

  • Вам нужна IDE?
  • Вам нужно профилирование кода?
  • Какое тестирование вы хотите сделать?
  • Насколько полезной является документация на языке? А для библиотек вы будете использовать?
  • Есть ли инструменты для заполнения потребностей, о которых вы даже не знали, что у вас еще есть?

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

tl; dr Я уверен, что производительность примерно такая же. Рассмотрим другие критерии.

Ответ 2

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

Мое наблюдение заключалось в том, что в Scala можно записать умеренно более быстрый и компактный высокопроизводительный параллельный код, чем в Haskell. Однако вы не можете просто использовать то, что наиболее очевидно приходит на ум на любом языке, и ожидать, что он будет быстро вспыхивать.

Scala больше не содержит утечек памяти, связанных с акторами, кроме случаев, когда вы используете участников по умолчанию в случае, когда вы ограничены ЦП, поэтому сообщения создаются быстрее, чем они потребляются, или вы забываете обрабатывать все ваши сообщения. Это выбор дизайна, а не ошибка, но может быть неправильным выбором дизайна для определенных типов отказоустойчивых приложений. Акка преодолевает эти проблемы, используя другую реализацию актеров.

Ответ 3

Взгляните на сравнение "голова к голове". Для некоторых проблем ghc и java7-server очень близки. Для одинаково много, есть разница в 2 раза, и только для одного есть разница в 5 раз. Эта проблема представляет собой k-нуклеотид, для которого версия GHC использует ручную гибкую хеш-таблицу, поскольку в stdlib нет хорошего. Я был бы готов поспорить, что некоторые из новых работ по созданию данных обеспечивают лучшие хеш-таблицы, чем сейчас.

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

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

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

Скорость хорошо и хорошо заботиться, но реальная разница заключается в использовании любого скомпилированного языка и любого языка сценариев. Кроме того, только в некоторых ситуациях HPC есть разногласия, о которых мы говорим, действительно имеющие значение.

Ответ 4

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

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

Часто, когда люди говорят об использовании concurrency, они забывают, что они делают это, чтобы сделать приложение быстрее. Существует множество примеров, когда использование нескольких потоков происходит не намного быстрее или намного медленнее. Я бы начал с эффективной однопоточной реализации, как профилированный/настроенный, как вы можете это сделать, а затем подумать о том, что может быть выполнено одновременно. Если не быстрее, чем один процессор, не делайте его параллельным.

IMHO: производительность - ваш самый высокий приоритет (за правильностью), concurrency - это только приоритет в выполнении домашних заданий.

Ответ 5

Я бы сказал Scala, но тогда я экспериментировал с Scala, поэтому мое предпочтение было бы, безусловно, Scala. Как бы то ни было, я видел немало высокопроизводительных многопоточных приложений, написанных на Java, поэтому я не уверен, почему этот характер приложения будет мандатом для FP. Я бы посоветовал вам написать очень маленький модуль, основанный на том, что потребуется вашему приложению как в Scala, так и в haskell, и измерить производительность вашей настройки. И, могу ли я добавить clojure в микс?:-) Я подозреваю, что вы можете остаться с java, если только вы не пользуетесь какой-либо другой особенностью выбранного вами языка.

Ответ 6

Есть ли у кого-нибудь тесты производительности/опыт использования Haskell vs Scala против Java для выполнения высококонкурентных задач?

Ваша конкретная архитектура решения имеет значение - это имеет большое значение.