Haskell与JVM性能

use*_*541 40 java haskell jvm scala

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

但是,速度也是一个优先事项.http://benchmarksgame.alioth.debian.org结果似乎表明Java几乎和C/C++一样快,Scala通常非常好,但对于大多数任务,Haskell的范围从慢到慢.

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

我见过的一些网站表明Scala有内存泄漏,这对于像这样的长期运行服务来说可能很糟糕.

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

谢谢

Dan*_*ton 21

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

  • 是否有团队正在研究这个,或者只是你?
    • 拥有这些语言的团队有多熟悉/舒适?
    • 这是一种你(所有)想要花时间学习的语言吗?
  • 谁来维护它?

行为

  • 这个项目有多长时间可以存在?
  • 什么时候可以接受停机时间?
  • 这个程序会做什么样的处理?
    • 是否有知名图书馆可以为您提供帮助?
    • 你愿意推出自己的图书馆吗?这种语言有多难?

社区

  • 你打算从开源中抽取多少钱?
  • 您打算为开源做多少贡献?
  • 社区多么生动有益
    • 在StackOverflow上
    • 在irc
    • 在Reddit上
    • 处理您可能使用的开源组件

工具

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

您应该考虑一百万个因素.无论您选择Scala,Java还是Haskell,我几乎可以保证您能够满足您的性能要求(这意味着,它可能需要大致相同的智能来满足您在任何这些语言中的性能要求).Haskell社区是非常有用的,我对Scala社区的有限经验与Haskell非常相似.就个人而言,与至少具有一流功能的语言相比,我开始发现Java相当狡猾.此外,还有更多的Java程序员,导致互联网上关于Java的信息激增,为了更好(更可能是你需要知道的那些)或更糟糕的(大量的噪音要筛选).

tl; dr我很确定表现大致相同.考虑其他标准.


Rex*_*err 10

您应该选择最了解的语言,并且对于您要完成的任务具有最佳的库支持(请注意,Scala可以使用Java库).如果你学到足够高效的资源,那么Haskell很可能足以满足你的需求,而Scala也是如此.如果您不太了解该语言,则编写高性能代码可能会很困难.

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

Scala不再有与actor相关的内存泄漏,除非你在CPU限制的情况下使用默认actor,因此消息的创建速度比消耗的快,或者你忘记处理所有消息.这是一个设计选择而不是错误,但对于某些类型的容错应用程序来说可能是错误的设计选择.Akka通过使用不同的actor实现来克服这些问题.


scl*_*clv 6

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

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

但同样,这实际上取决于你在做什么.如果您正在搜索大型数据集,那么您将倾向于受IO限制.如果您正在优化遍历不可变结构,那么haskell就可以了.如果你正在改变一个复杂的结构,那么你可能(依赖)支付更多.

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

速度很好,值得关注,但真正的区别在于使用任何编译语言和任何脚本语言.除此之外,只有在某些HPC情况下,我们所讨论的各种差异确实很重要.


Pet*_*rey 5

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

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

通常当人们谈论使用并发时,他们忘记了他们这样做的原因是为了使应用程序更快.有很多例子表明使用多个线程并不是更快或更慢.我将从一个有效的单线程实现开始,如您可以进行分析/调整,然后考虑可以同时执行的内容.如果它不超过一个CPU,请不要使它并发.

恕我直言:性能是你的最高优先级(落后于正确性),并发性只是家庭作业的一个优先事项.

  • 不对 - C/C++不是"参考实现".例如,pi-digits任务取自Haskell程序,线程环任务取自Erlang程序,fannkuch取自Lisp程序,二进制树和n-body取自Java程序,. ..我不编程C/C++,这使得我无法使用C/C++进行参考实现. (6认同)