Haskell vs JVM的性能

我想写一个网站的后端系统(这将是一个自定义的search式服务)。 它需要高度并发和快速。 考虑到并发的愿望,我打算使用Haskell或Scala之类的函数式语言。

但速度也是重中之重。 http://benchmarksgame.alioth.debian.org结果似乎表明,Java几乎和C / C ++一样快,Scala一般都很好,但是对于大多数任务来说,Haskell的范围从慢到慢很多。

有没有人有任何性能的基准/经验使用哈斯克尔vs斯卡拉vs Java执行高度并发的任务?

我见过的一些网站表明,斯卡拉有内存泄漏,这可能是长期运行的服务,如这一个可怕的。

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

谢谢

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

  • 有没有一个团队在这个工作,或只是你?
    • 这些团队对这些语言有多熟悉/舒适?
    • 这是一种语言,你(全部)想要投入时间学习?
  • 谁来维护它?

行为

  • 这个项目预计能活多久?
  • 如果有的话,宕机时间是否可以接受?
  • 这个程序会做什么样的处理?
    • 有知名的图书馆可以帮助你吗?
    • 你愿意推出自己的图书馆吗? 这种语言有多难?

社区

  • 您打算从开源获取多less?
  • 您打算为开源贡献多less?
  • 这个社区多么活跃和有帮助
    • 在StackOverflow上
    • 在irc上
    • 在Reddit上
    • 使用您可能会使用的开源组件

工具

  • 你需要一个IDE吗?
  • 你需要代码分析?
  • 你想做什么样的testing?
  • 该语言的文档有多大帮助? 而对于你将使用的图书馆?
  • 是否有工具可以满足您甚至不知道自己的需求?

还有一百万和一个其他的因素,你应该考虑。 无论您selectScala,Java还是Haskell,我几乎都可以保证您能够满足您的性能要求(也就是说,可能需要大致相同的智能来满足您在这些语言中的性能要求)。 Haskell社区是非常有帮助的,而我在Scala社区的有限经验与Haskell很相似。 就我个人而言,相比于至less具有一streamfunction的语言,我开始发现Java比较麻烦。 此外,还有更多的Java程序员在那里,导致在互联网上关于Java的信息激增,更好(更可能是你需要知道的是在那里)或更糟糕的(大量的噪音筛选)。

我很确定,性能大致相同。 考虑其他标准。

你应该select你知道最好的语言,哪一个最好的库支持你想要完成的(注意Scala可以使用Java库)。 Haskell很可能足够满足您的需求,如果您足够有效地使用它,Scala也是如此。 如果你不太了解这个语言,就很难编写高性能的代码。

我的观察是,人们可以在Scala中编写比Haskell更快更紧凑的高性能并行代码。 不过,无论使用哪种语言,都不能使用任何最明显的语言,并期望它能快速发展。

除非在CPU限制的情况下使用默认actor, 否则 Scala没有与actor相关的内存泄漏,所以消息创build速度快于消耗,或者忘记处理所有消息。 这是一个deviseselect,而不是一个错误,但对于某些types的容错应用程序来说,这可能是错误的deviseselect。 Akka通过使用不同的angular色实现来克服这些问题。

看一下头对头的比较。 对于一些问题ghc和java7-server是非常接近的。 对于同样多的,有一个2倍的差异,只有一个有5倍的差异。 这个问题是GHC版本使用手摇可变哈希表的k核苷酸,因为在stdlib中没有好的哈希表。 我敢打赌,一些新的数据结构提供了比现在更好的哈希表。

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

但是,这又取决于你在做什么。 如果你正在search一个大的数据集,你会倾向于IO绑定。 如果你正在优化遍历一个不可变的结构,haskell将会很好。 如果你正在改变一个复杂的结构,那么你可能(取决于)支付更多。

此外,GHC的轻量级绿色线程可以使特定types的服务器应用程序非常高效。 所以如果服务/交换本身往往是一个瓶颈,那么GHC可能会有所作为。

速度是很好的关心,但真正的区别在于使用任何编译语言和任何脚本语言。 除此之外,只有在特定的高性能计算环境下,我们所谈论的差异才是真正重要的。

枪战基准假设在所有实现中使用相同的algorithm。 这对C / C ++(这是大多数情况下的参考实现)和类似的语言是最有利的。 如果你使用不同的方法适合不同的语言,这是不合格的。

如果你从一个在Haskell中更自然地描述的问题开​​始,那么它将在那个语言中performance得最好(或者非常像它)

通常,当人们谈论使用并发时,他们忘记了自己正在做的原因是让应用程序更快。 有很多使用multithreading的例子不是太快或太慢。 我将从一个高效的单线程实现开始,按照您的设置进行概要分析/调优,然后考虑可以同时执行的内容。 如果这个不止一个CPU速度更快,不要让它并发。

恕我直言:性能是您的最高优先级(在正确性之后),并发只是作业练习中的一个优先事项。

我会说斯卡拉,但是我一直在试验斯卡拉,所以我的偏好一定是斯卡拉。 不pipe怎么样,我已经看到了不less用Java编写的高性能multithreading应用程序,所以我不确定为什么应用程序的这种性质会强制执行FP。 我build议你写一个非常小的模块,基于你的应用程序在scala和haskell中需要什么,并测量你设置的性能。 而且,我是否也可以混合使用clojure? :-)我怀疑你可能想留在Java,除非你正在从你select的语言的任何其他function受益。

有没有人有任何性能的基准/经验使用哈斯克尔vs斯卡拉vs Java执行高度并发的任务?

您的具体解决scheme体系结构至关重要 – 这很重要 。