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

Haskell, Scala, Clojure, что выбрать для высокопроизводительного соответствия шаблонов и concurrency

Недавно я начал работу над FP после прочтения большого количества блогов и сообщений о преимуществах FP для одновременного выполнения и производительности. Моя потребность в FP во многом зависит от приложения, которое я разрабатываю. Мое приложение - это инжектор данных на основе данных в другую подсистему, где время очень важно (около 2 миллионов транзакций в секунду). У меня есть пара таких подсистем, которые необходимо протестировать. Я серьезно рассматриваю возможность использования FP для своего parallelism и хочу принять правильный подход. Многие сообщения на SO говорят о недостатках и преимуществах Scala, Haskell и Clojure для языковых конструкций, библиотек и поддержки JVM. С точки зрения языка я в порядке, чтобы выучить любой язык, пока он поможет мне достичь результата.

Некоторые сообщения одобряют использование Haskell для соответствия шаблонов и простоты языка, основанные на JVM FP lang имеют большое преимущество в отношении использования существующих java-библиотек. JaneStreet - большой сторонник OCAML, но я действительно не уверен в поддержке разработчиков и помогает форумам OCAML.

Если кто-то работал с обработкой таких больших данных, поделитесь своим опытом.

4b9b3361

Ответ 1

Хотите быстро или вам легко?

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

Три языка, которые вы указали, ~ 2-3x медленнее, чем почти оптимально настроенный вручную С++, как правило,, и тогда только при использовании в довольно традиционном императивном порядке. Все они используют сбор мусора, что приведет к неконтролируемым случайным задержкам в ваших транзакциях.

Теперь, это сказало, это большая работа, чтобы добиться этого в пуленепробиваемой моде с С++. Применение принципов FP требует значительно большего количества шаблонов (даже в С++ 11), и большинство библиотек по умолчанию изменяются. (Редактирование: Ржавчина становится хорошей альтернативой, но это выходит за рамки этого ответа, чтобы описать Rust достаточно подробно.)

Возможно, у вас нет времени и вы можете позволить себе масштабировать другие спецификации. Например, если нет времени, но пропускная способность важна, то вы, вероятно, захотите Scala через Clojure (см. Компьютерная игра Benchmark Game, где Scala выигрывает каждый бенчмарк на момент написания этой статьи и имеет меньший размер кода почти в каждом случае (Edit: CLBG больше не помогает в этом отношении, хотя вы можете найти архивы, поддерживающие эти утверждения в веб-архиве)); OCaml и Haskell следует выбирать по другим причинам (аналогичные контрольные оценки, но они имеют различный синтаксис и совместимость и т.д.).

Насколько у системы самая лучшая поддержка concurrency, Haskell, Clojure и Scala все в порядке, в то время как OCaml немного отсутствует.

Это в значительной степени сужает его до Haskell и Scala. Вам нужно использовать библиотеки Java? Scala. Вам нужно использовать библиотеки C? Вероятно, Хаскелл. Вам тоже не нужны? Затем вы можете выбрать либо на основе которого вы предпочитаете стилистически, не беспокоясь чрезмерно много, что вы сделали вашу жизнь намного сложнее, выбрав неправильный.

Ответ 2

Я сделал это с помощью Clojure, который оказался довольно эффективным по следующим причинам:

  • Быть на JVM - огромное преимущество в плане библиотек. Это эффективно исключало Haskell и Ocaml для моих целей, поскольку нам нужен был легкий доступ к экосистеме Java и интеграция с инструментами на основе JVM (сборка Maven и т.д.).
  • Вы можете перейти в чистую Java, если вам нужно плотно оптимизировать внутренние циклы. Мы сделали это для обработки отдельных массивов больших массивов double [], но в 99% случаев Clojure вы можете получить необходимую вам производительность. См. http://www.infoq.com/presentations/Why-Prismatic-Goes-Faster-With-Clojure для некоторых примеров того, как сделать Clojure очень быстрым (довольно техническое видео, предполагает некоторые предварительные знания!). Как только вы начнете считать легкость использования нескольких ядер, Clojure очень конкурентоспособна по производительности.
  • Clojure имеет очень приятную многоядерную поддержку concurrency. Это оказалось чрезвычайно полезным для управления параллельными задачами. См. http://www.infoq.com/presentations/Value-Identity-State-Rich-Hickey
  • REPL создает отличную среду для тестирования и поисковой работы с данными.
  • Clojure ленив, что делает его пригодным для обработки наборов данных большего размера (при условии, что вы стараетесь не пытаться сразу заставить весь набор данных в память). В такой среде есть также несколько хороших библиотек, наиболее примечательными являются Storm и Aleph, Storm может быть особенно интересен для вас, поскольку он предназначен для распределенной обработки в реальном времени большого количества событий.

Я не могу говорить с таким большим опытом других языков, но мое впечатление от некоторого практического опыта Haskell и Scala:

  • Haskell замечателен, если вы заботитесь о чистоте и строгом функциональном программировании со статическими типами. Статическая типизация может быть сильной гарантией правильности, поэтому может сделать это подходящим для высоко алгоритмической работы. Лично я считаю, что чистая FP слишком жесткая - есть много раз, когда изменяемое состояние полезно, и я думаю, что Clojure имеет немного лучший баланс здесь (разрешая управляемые управляемые ссылки muability tough).
  • Scala - отличный язык и делится с Clojure преимуществами на JVM. Для меня Scala больше похож на "лучшую Java" с функциональными функциями и очень впечатляющей системой типов. Это меньше сдвига парадигмы от Clojure. Недостатком является то, что система типов может стать довольно сложной/запутанной.

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