Haskell,Scala,Clojure,高性能模式匹配和并发性select

最近我读了很多关于FP在并发执行和性能方面的优点的博文, 我对FP的需求很大程度上受到我正在开发的应用程序的影响,我的应用程序是一个基于状态的数据注入到另一个时间非常关键(每秒接近200万事务)的子系统。 我有几个这样的子系统需要testing。 我正在认真考虑使用FP来实现并行性,并希望采取正确的方法,很多SO上的文章都谈到了Scala,Haskell和Clojure的语言结构,库和JVM支持的缺点和优点。 从语言的angular度来看,只要能帮助我达到目标,我就可以学习任何语言。

某些post赞同Haskell的模式匹配和语言的简单性,基于JVM的FP lang在使用现有的java库方面有很大的优势。 JaneStreet是OCAML的大支持者,但是我真的不确定开发者支持和帮助OCAML的论坛。

如果有人处理这样的大数据,请分享您的经验。

你想快速还是要轻松

如果你想要快,你应该使用C ++,即使你使用FP原则来帮助正确。 由于时间安排至关重要,对实时编程软件(如果需要的话)的支持将非常重要。 您可以决定如何以及何时有时间恢复记忆,并且只花费尽可能多的时间来完成这项任务。

你所说的三种语言都比C ++倾向于接近最佳手动调整的速度慢2-3倍 ,然后才以相当传统的方式使用。 他们都使用垃圾收集,这将在您的交易中引入不受控制的随机延迟。

现在,这就是说,用C ++来实现这一点是非常棒的。 应用FP原则需要相当多的样板(甚至在C ++ 11中),大多数库默认是可变的。 (编辑:铁锈正在成为一个很好的select,但是这个答案的范围超出了Rust的详细描述。)

也许你没有时间,可以缩减其他规格。 例如,如果不是时序,吞吐量是至关重要的,那么您可能希望Scala超越Clojure(请参阅计算机语言基准游戏 ,在撰写本文时,Scala赢得了所有基准testing, 并且在几乎所有情况下都具有较低的代码大小(编辑: CLBG在这方面不再有帮助,尽pipe你可能会在Web Archive上find支持这些语句的档案)); OCaml和Haskell应该select其他原因(类似的基准分数,但是它们有不同的语法和互操作性等等)。

至于哪个系统具有最好的并发支持,Haskell,Clojure和Scala都不错,而OCaml则有点欠缺。

这几乎把它缩小到了Haskell和Scala。 你需要使用Java库吗? 斯卡拉。 你需要使用C库吗? 可能是Haskell。 你不需要吗? 那么你可以根据自己喜欢的风格来select,而不必过于担心你select错误的方式让自己的生活变得越来越难。

我已经用Clojure做了这个,事实certificate这很有效,原因如下:

  • 使用JVM在图书馆方面是一个巨大的优势 。 这有效地排除了Haskell和Ocaml的用途,因为我们需要轻松访问Java生态系统并与基于JVM的工具(Maven构build等)集成。
  • 如果您需要紧密优化内部循环,则可以将其放入纯Java中。 我们这样做了一些自定义的代码处理大的double []数组,但是99%的时间Clojure可以为您提供所需的性能。 有关如何使Clojure变得非常快的一些示例(相当技术性的video,假设一些先前的知识),请参见http://www.infoq.com/presentations/Why-Prismatic-Goes-Faster-With-Clojure 。 一旦你开始计算开发多核心的容易度,Clojure在性能上是非常有竞争力的。
  • Clojure拥有非常好的多核并发支持。 这被certificate对于pipe理并发任务非常有用。 见http://www.infoq.com/presentations/Value-Identity-State-Rich-Hickey
  • REPL为数据的testing和探索工作提供了一个非常好的环境。
  • Clojure是懒惰的 ,这使得它适合于处理大于内存的数据集(假设你小心不要尝试强制整个数据集一次进入内存)。 在这样的环境中也有一些很好的库,其中最着名的是Storm和Aleph 。 风暴对你来说可能特别有趣,因为它是为大量事件的分布式实时处理而devise的。

我不能说很多其他语言的经验,但是我对Haskell和Scala的一些实际经验的印象是:

  • Haskell是伟大的,如果你关心纯度和静态types严格的函数式编程。 静态types可以是正确性的有力保证,因此可以使其适用于高度algorithm化的工作。 就个人而言,我发现纯粹的FP 有点过于僵化 – 有时候可变状态很有用,我认为Clojure在这里有一个稍微好一点的平衡(通过允许可控的可操作性来pipe理参考)。
  • Scala是一门伟大的语言,与Clojure共享JVM上的优势。 对我来说,Scala更像是一个“更好的Java”,具有function特征和非常令人印象深刻的types系统。 与Clojure的范式转换不太一样。 缺点是types系统可能变得相当复杂/混乱。

总的来说,我认为你可以对这些中的任何一个感到满意。 这可能会归结为你关心JVM和你对types系统的看法。