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上运行的代码的性能.但是还有很多其他因素可以发挥作用.
人
行为
社区
工具
您应该考虑一百万个因素.无论您选择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实现来克服这些问题.
看看头对头的比较.对于某些问题,ghc和java7-server非常接近.同样多的,有2倍的差异,只有一个有5倍的差异.这个问题是k-nucleotide,GHC版本使用手动可变哈希表,因为stdlibs中没有一个好的哈希表.我愿意打赌,一些新的数据结构工作提供了比现在更好的哈希表.
在任何情况下,如果你的问题更像是第一组问题(纯计算)那么就没有很大的性能差异,如果它更像是第二组(通常是基本使用变异),那么即使是突变,你也可能会注意到有点性能差异.
但同样,这实际上取决于你在做什么.如果您正在搜索大型数据集,那么您将倾向于受IO限制.如果您正在优化遍历不可变结构,那么haskell就可以了.如果你正在改变一个复杂的结构,那么你可能(依赖)支付更多.
此外,GHC的轻量级绿色线程可以使某些类型的服务器应用程序非常高效.因此,如果服务/交换本身往往是一个瓶颈,那么GHC可能会有所提升.
速度很好,值得关注,但真正的区别在于使用任何编译语言和任何脚本语言.除此之外,只有在某些HPC情况下,我们所讨论的各种差异确实很重要.
枪战基准测试假设在所有实现中使用相同的算法.这为C/C++(大多数情况下是参考实现)和类似语言提供了最大的优势.如果您使用的是适合不同语言的不同方法,则会被取消资格.
如果你从一个在Haskell中更自然地描述的问题开始,它将在该语言中表现最佳(或者非常类似)
通常当人们谈论使用并发时,他们忘记了他们这样做的原因是为了使应用程序更快.有很多例子表明使用多个线程并不是更快或更慢.我将从一个有效的单线程实现开始,如您可以进行分析/调整,然后考虑可以同时执行的内容.如果它不超过一个CPU,请不要使它并发.
恕我直言:性能是你的最高优先级(落后于正确性),并发性只是家庭作业的一个优先事项.