【问题标题】:Haskell vs JVM performance [closed]Haskell vs JVM性能[关闭]
【发布时间】:2012-01-01 09:15:46
【问题描述】:

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

不过,速度也是重中之重。 http://benchmarksgame.alioth.debian.org 结果似乎表明 Java 几乎与 C/C++ 一样快,Scala 通常相当不错,但对于大多数任务,Haskell 的范围从慢到慢很多。

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

我看到的一些网站表明 Scala 存在内存泄漏,这对于像这个这样的长期运行的服务来说可能是可怕的。

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

谢谢

【问题讨论】:

  • 您有任何理由假设您的问题与那些基准测试解决的问题类似吗?您是否有任何理由假设您实际上会优化您的代码,就像这些基准已经优化(也就是说,一大堆)?如果没有,这些基准对您来说毫无价值。另请注意,在最坏的情况下,Haskell 基准测试可能比 Java 慢 10 倍,但对于大多数 Scala 基准测试来说,差距要小得多。
  • 如果你评估 Haskell,那么请使用 GHC v7,它使用 LLVM donsbot.wordpress.com/2010/02/21/… 快得多的代码。Haskell 与其他任何东西相比应该会有巨大的性能提升由于 LLVM 进行了评估。请注意,目前仍有发行版仅提供 GHC v6,尤其是适用于 Mac OS X 的 MacPorts。
  • 不用担心 Scala 的内存泄漏。它曾经是内置actor实现的问题,但我相信这个问题现在已经解决了,无论如何Akka正在成为actor的首选库。
  • @igouy:是的,但据我所知,他们没有使用 LLVM 代码生成器,必须使用 -fllvm 选项显式启用。
  • @delnan - “你有什么理由假设你实际上会优化你的代码,就像这些基准已经优化(也就是说,一大堆)?”又名你能像唐斯图尔特一样写出像唐斯图尔特一样好的 Haskell 吗?-)

标签: java scala haskell jvm


【解决方案1】:

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

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

行为

  • 这个项目预计能活多久?
  • 什么时候可以接受停机时间(如果有的话)?
  • 这个程序会做什么样的处理?
    • 是否有知名的图书馆可以帮助您解决这个问题?
    • 您愿意推出自己的图书馆吗?用那种语言做这件事有多难?

社区

  • 您打算从开源中提取多少?
  • 您打算为开源做出多少贡献?
  • 社区是多么的活跃和乐于助人
    • 在 StackOverflow 上
    • 在 irc 上
    • 在 Reddit 上
    • 开发您可能会用到的开源组件

工具

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

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

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

【讨论】:

  • “Haskell 社区非常乐于助人,而我在 Scala 社区的有限经验与 Haskell 非常相似。” - 我根本不了解 Haskell 社区,但我在 Scala 社区的经历非常糟糕。您是否在“有用”中留下了“un”,或者您是否找到了 Scala 社区的非小众子集?如果是这样,你能指点我吗?我可以在我的 Scala 编码中使用一些帮助。
  • @kittylyst:在 StackOverflow 上就 #scala irc 和 scala 标签提出问题对我有很大帮助。有时需要谨慎才能产生良好的体验。例如,我谨慎地措辞my latest Scala question 以避免听起来有对抗性。此外,有时在提问时,您必须对您根本没有以“Scala 方式”思考的可能性持开放态度;如果/当人们告诉你时,尽量不要冒犯。
【解决方案2】:

你应该选择你最了解的语言,并且为你想要完成的事情提供最好的库支持(注意 Scala 可以使用 Java 库)。 Haskell 很可能足以满足您的需求,如果您学习到足以有效地使用它,对于 Scala 也是如此。如果您不太了解该语言,则可能很难编写高性能代码。

我的观察是,与在 Haskell 中相比,在 Scala 中编写的高性能并行代码的速度适中,更紧凑。但是,您不能只使用任何一种语言中最明显想到的任何内容,并期望它会很快。

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

【讨论】:

    【解决方案3】:

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

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

    但同样,这真的取决于你在做什么。如果您正在搜索大型数据集,您往往会受到 IO 限制。如果您正在优化不可变结构的遍历,haskell 会很好。如果你正在改变一个复杂的结构,那么你可能(视情况而定)付出更多。

    此外,GHC 的轻量级绿色线程可以使某些类型的服务器应用程序非常高效。因此,如果服务/切换本身往往会成为瓶颈,那么 GHC 可能会有所帮助。

    速度很好,值得关注,但真正的区别在于使用任何编译语言和任何脚本语言。除此之外,只有在某些 HPC 情况下,我们正在谈论的那种差异真的才有意义。

    【讨论】:

    • “但真正的区别在于使用任何编译语言和任何脚本语言” - 除非“你会倾向于受 IO 限制”?
    • @igouy:呵呵,点了。但即便如此,widefinder 2 结果仍以编译语言为主:wikis.sun.com/display/WideFinder/Results
    【解决方案4】:

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

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

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

    恕我直言:性能是您的最高优先级(仅次于正确性),并发性只是家庭作业中的优先级。

    【讨论】:

    • 不正确 - C/C++ 不是“参考实现”。例如,pi-digits 任务来自 Haskell 程序,thread-ring 任务来自 Erlang 程序,fannkuch 来自 Lisp 程序,二叉树和 n-body 来自 Java 程序,. .. 我不会编程 C/C++,这完全阻止了我使用 C/C++ 进行参考实现。
    • 事实上,我的实践是通过用 Clean、C# 和 PHP 编写程序来测试任务的适用性。
    • Lawrey 暗指这样的句子:“每个程序必须实现 4 个单独的函数/过程/方法,例如 [C# 程序](link)。”一般来说,参赛作品会因未遵循此类说明而被拒绝。 (顺便说一句,Scala 条目是根据什么原则被接受或拒绝的,现在看看它们:)。)
    • @applicative - 请说明 Peter Lawrey 在哪里实际说过这句话,或者我们应该相信您对他的想法有深入了解的其他原因。同时对特定的 Scala 程序提出具体的投诉,以便对其进行检查——而不是模糊的影射。
    【解决方案5】:

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

    您的具体解决方案架构很重要 - it matters a lot

    【讨论】:

      【解决方案6】:

      我会说 Scala,但后来我一直在试验 Scala,所以我的首选肯定是 Scala。无论如何,我已经看到了很多用 Java 编写的高性能多线程应用程序,所以我不确定为什么应用程序的这种性质会要求使用 FP。我建议您根据您的应用程序在 scala 和 haskell 中所需的内容编写一个非常小的模块,并测量您设置的性能。而且,我还可以在混合物中添加 clojure 吗? :-) 我怀疑您可能想继续使用 java,除非您希望从您选择的语言的任何其他功能中受益。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-30
        • 2021-11-06
        • 2013-10-11
        • 2011-03-25
        • 1970-01-01
        相关资源
        最近更新 更多