Haskell vs JVM performance



我想为一个网站写一个后端系统(它将是一个自定义搜索风格的服务)。它需要高度并发和快速。考虑到我对并发性的期望,我计划使用函数式语言,如Haskell或Scala。

然而,速度也是一个优先级。http://benchmarksgame.alioth.debian.org结果显示,Java几乎和C/c++一样快,Scala通常也很好,但Haskell在大多数任务上的速度从慢到慢得多。

有没有人有使用Haskell、Scala和Java执行高并发任务的性能基准/经验?

我看到的一些网站暗示Scala有内存泄漏,这对于像这个这样长时间运行的服务来说可能是可怕的。

我应该用什么来写我的服务,或者在选择之前我应该考虑什么(性能和并发性是最高优先级)?

谢谢

这个问题表面上是关于用GHC编译的代码和在JVM上运行的代码的性能。但是还有很多其他因素在起作用。

  • 有团队在做这个吗,还是只有你一个人?
    • 团队对这些语言的熟悉程度/舒适度如何?
    • 这是你(所有人)想花时间学习的语言吗?
  • 谁来维护?

  • 这个项目的预期寿命是多长?
  • 什么时候(如果有的话)停机是可以接受的?
  • 这个程序将做什么样的处理?
    • 有没有知名的库可以帮助你做到这一点?
    • 你愿意拥有自己的图书馆吗?用那种语言会有多难?

  • 你们计划从开源中获取多少?
  • 你计划为开源贡献多少?
  • 社区多么活跃和乐于助人啊
      在StackOverflow
    • 在irc
    • 在Reddit
    • 在你可能使用的开源组件上工作
工具>
  • 您需要IDE吗?
  • 你需要代码分析吗?
  • 你想做什么样的测试?
  • 语言的文档有多大帮助?至于你要使用的图书馆呢?
  • 有没有工具可以满足你甚至不知道你已经有了的需求?

还有很多其他的因素你应该考虑。无论您选择Scala、Java还是Haskell,我几乎可以保证您将能够满足您的性能需求(也就是说,在这些语言中,满足您的性能需求可能需要大约相同数量的智能)。Haskell社区是出了名的乐于助人,我在Scala社区的有限经验与Haskell非常相似。就我个人而言,我开始发现与那些至少拥有一等函数的语言相比,Java相当讨厌。此外,有更多的Java程序员,导致互联网上关于Java的信息激增,或好(您需要知道的更多)或坏(需要筛选的噪音很多)。

tl;dr我非常确定性能大致相同。考虑其他标准。

您应该选择您最熟悉的语言,并且对于您想要完成的任务具有最好的库支持(注意Scala可以使用Java库)。Haskell很可能足以满足你的需求,如果你学得足够多,可以有效地使用它,Scala也是如此。如果你对语言不太了解,就很难写出高性能的代码。

我的观察是,与Haskell相比,在Scala中可以编写更快的更紧凑的高性能并行代码。然而,你不能只使用任何一种语言中最明显的东西,并期望它非常快。

Scala不再有actor相关的内存泄漏,除了,如果您在cpu有限的情况下使用默认actor,那么消息的创建速度比它们被消耗的速度快,或者您忘记处理所有消息。这是一种设计选择,而不是错误,但对于某些类型的容错应用程序来说,这可能是错误的设计选择。Akka通过使用不同的actor实现来克服这些问题。

看一下头对头比较。对于某些问题,ghc和java7-server非常接近。对于同样多的,有2x的差异,对于只有一个,有5x的差异。这个问题是k-nucleotide, GHC版本使用手工滚动的可变哈希表,因为标准库中没有一个好的哈希表。我敢打赌,一些新的数据结构会提供比现在更好的哈希表。

在任何情况下,如果您的问题更像第一组问题(纯计算),那么不会有很大的性能差异,如果它更像第二组问题(通常需要使用突变),那么即使有突变,您也可能会注意到一些性能差异。

但是,这真的取决于你在做什么。如果你正在搜索一个大的数据集,你可能会受到IO限制。如果你正在优化一个不可变结构的遍历,haskell将会很好。如果你要改变一个复杂的结构,那么你可能(取决于)要付出更多的代价。

此外,GHC的轻量级绿色线程可以使某些类型的服务器应用程序非常高效。因此,如果服务/切换本身往往是一个瓶颈,那么GHC可能会占上风。

关注速度是件好事,但真正的区别在于使用任何编译语言和任何脚本语言之间的区别。除此之外,只有在某些HPC情况下,我们所讨论的的各种差异才会真正起作用。

枪战基准测试假设在所有实现中使用相同的算法。这为C/c++(在大多数情况下是参考实现)和类似的语言提供了最大的优势。如果您要使用适合不同语言的不同方法,则不合格。

如果你从一个更自然地用Haskell描述的问题开始,它将在该语言(或非常类似的语言)中表现得最好

通常当人们谈论并发时,他们忘记了他们这样做的原因是为了使应用程序更快。在很多例子中,使用多线程既不会更快,也不会更慢。我会从一个高效的单线程实现开始,尽可能地对其进行分析/调优,然后考虑哪些可以并发执行。如果一个以上的CPU不能让它更快,那就不要让它并发。

IMHO:性能是你的最高优先级(仅次于正确性),并发性只是家庭作业中的优先级。

是否有人有任何性能基准/使用经验Haskell vs Scala vs Java执行高并发任务?

您的特定解决方案架构很重要——非常重要。

我会说Scala,但我一直在用Scala做实验,所以我的首选肯定是Scala。无论如何,我已经看到了相当多用Java编写的高性能多线程应用程序,所以我不确定为什么应用程序的这种性质会要求使用FP。我建议您根据您的应用程序在scala和haskell中需要的内容编写一个非常小的模块,并在您的设置上测量性能。我还可以在混合物中加入clojure吗?

我怀疑你可能想继续使用java,除非你想从你选择的语言的任何其他特性中受益。

最新更新