44

在阅读了很多关于 FP 在并发执行和性能方面的优势的博客和帖子之后,我最近开始研究 FP。我对 FP 的需求很大程度上受到我正在开发的应用程序的影响,我的应用程序是一个基于状态的数据注入器,它可以插入另一个时间非常关键的子系统(接近每秒 200 万个事务)。我有几个这样的子系统需要测试。我正在认真考虑使用 FP 的并行性并希望采用正确的方法,SO 上的许多帖子都谈到了 Scala、Haskell 和 Clojure wrt 语言结构、库和 JVM 支持的优缺点。从语言的角度来看,我可以学习任何语言,只要它能帮助我达到结果。

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

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

4

2 回答 2

53

你想要快速还是想要轻松

如果你想要快速,你应该使用 C++,即使你使用 FP 原则来帮助正确。由于时间至关重要,因此对软(和硬,如果需要)实时编程的支持将很重要。您可以准确地决定如何以及何时有时间恢复记忆,并且只在该任务上花费尽可能多的时间。

您所说的三种语言都比接近最佳的手动调整的 C++ 慢 2-3 倍,而且只有在以相当传统的命令式方式使用时。它们都使用垃圾收集,这将在您的事务中引入不受控制的随机延迟。

现在,就是说,要使用 C++ 以防弹的方式运行它需要做很多工作。应用 FP 原则需要相当多的样板文件(即使在 C++11 中),并且大多数库默认情况下是可变的。(编辑:Rust 正在成为一个不错的选择,但是足够详细地描述 Rust 超出了这个答案的范围。)

也许您没有时间并且有能力缩减其他规格。例如,如果关键的不是时间而是吞吐量,那么您可能需要 Scala 而不是 Clojure(请参阅计算机语言基准游戏,其中 Scala 在撰写本文时赢得了所有基准测试,并且几乎在每种情况下都具有较小的代码大小(编辑: CLBG 在这方面不再有帮助,尽管您可以在 Web 档案中找到支持这些声明的档案));应该选择 OCaml 和 Haskell 是出于其他原因(类似的基准分数,但它们具有不同的语法和互操作性等)。

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

这几乎将其范围缩小到 Haskell 和 Scala。您需要使用 Java 库吗?斯卡拉。您需要使用 C 库吗?可能是哈斯克尔。你都不需要吗?然后,您可以根据自己喜欢的风格进行选择,而不必过分担心选择错误的人会使您的生活变得更加艰难。

于 2012-07-23T06:23:54.933 回答
27

我已经使用 Clojure 完成了这项工作,由于以下原因,这被证明非常有效:

  • 就库而言,在 JVM 上是一个巨大的优势。出于我的目的,这有效地排除了 Haskell 和 Ocaml,因为我们需要轻松访问 Java 生态系统并与基于 JVM 的工具(Maven 构建等)集成。
  • 如果您需要严格优化内部循环,您可以使用纯 Java。我们为一些处理大型 double[] 数组的自定义代码执行此操作,但 99% 的时间 Clojure 可以为您提供所需的性能。有关如何使 Clojure 真正快速运行的一些示例,请参见http://www.infoq.com/presentations/Why-Prismatic-Goes-Faster-With-Clojure (相当技术视频,假设有一些先验知识!)。一旦您开始计算利用多个内核的难易程度,Clojure 在性能上就非常具有竞争力。
  • Clojure 有非常好的多核并发支持。事实证明,这对于管理并发任务非常有用。见http://www.infoq.com/presentations/Value-Identity-State-Rich-Hickey
  • REPL 为数据测试和探索性工作提供了一个非常好的环境。
  • Clojure 是惰性的,这使得它适合处理大于内存的数据集(假设您小心不要尝试将整个数据集一次强制放入内存)。在这样的环境中也有一些不错的库可用,最值得注意的是StormAleph。Storm 对您来说可能特别有趣,因为它是为大量事件的分布式实时处理而设计的。

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

  • 如果您关心静态类型的纯度和严格的函数式编程,Haskell 非常棒。静态类型可以是正确性的有力保证,因此可能使其适用于高度算法的工作。就个人而言,我发现纯 FP有点过于死板——很多时候可变状态很有用,我认为 Clojure 在这里有更好的平衡(通过通过托管引用允许受控的可变性)。
  • Scala 是一门很棒的语言,它与 Clojure 共享在 JVM 上的优势。对我来说,Scala 更像是一个“更好的 Java”,具有功能特性和令人印象深刻的类型系统。这不是从 Clojure 的范式转变。缺点是类型系统可能会变得非常复杂/令人困惑。

总的来说,我认为您可能会对其中任何一个感到满意。这可能会归结为您对 JVM 的关心程度以及您对类型系统的看法。

于 2012-07-23T06:22:58.040 回答