什么是更高效的?Haskell或OCaml

dat*_*olf 55 benchmarking ocaml haskell

我花了18个月的时间来掌握函数式编程,从学习OCaml开始,现在已经有几个星期的Haskell了.现在我想采取下一步并实现一些实际的应用程序:一个简单的实时地形编辑器.我写了很多实时地形渲染引擎,所以这是一个熟悉的主题.使用的递归算法和数据结构似乎非常适合功能实现.

由于这是一个实时应用程序,我自然而然地寻找我能得到的最佳性能.现在,与OCaml或F#相比,OCaml的一些(恕我直言,非常烦人)支持者反对Haskell的频率很慢.但根据计算机语言基准测试游戏 Haskell经常击败OCaml,如果只是相当小的分数 - 仍然存在问题,这个基准测试只需要非常具体的样本.

正确的做法当然是用两种语言实现程序并进行比较,但我根本不想做双重工作.

但也许其他人在OCaml和Haskell中做了类似的应用程序并提供了一些数据?

scl*_*clv 60

从各方面来看,OCaml和Haskell都具有足够高性能的编译器和几乎任何运行时.在纯粹的表现基础上挑选他们对我来说似乎很愚蠢.你已经走到了这一步 - 以更清晰,更简洁,更具表现力,更高级别的代码的名义远离显然最低级别和高性能的语言(C,C++等).那么,为什么当涉及的性能差异要小得多时,现在就改用这个标准呢?

我会选择一些更广泛的标准 - 如果你想要普遍的并行性,那么Haskell是更好的选择.如果你想要真正普遍的变异,那么OCaml会更好.

如果你只想要非常粗略的并行性,并且你打算坚持使用大多数功能结构,那么选择基于其他东西,比如语法(我认为Haskell在这里更好,但这是主观的)或可用的库(Haskell在数量上获胜) /可用性,但OCaml可能会在图形部门中将其排除在外.)

我认为你不会出错

  • 但基准测试显示它们是颈部和颈部.没有数量级. (16认同)
  • @Tyr:取决于你看哪个基准.这个问题是关于软实时性能,这意味着延迟和吞吐量.对于这种类型的应用程序而言,GHC的stop-the-world GC会产生过长的暂停时间,比OCaml增量GC的暂停时间长几个数量级.其他一切都是多余的. (13认同)
  • "在纯粹的表现基础上挑选他们对我来说似乎很愚蠢".即使性能差异可以达到几个数量级? (7认同)
  • C++ 11不是低级别的. (2认同)

Nor*_*sey 38

在两位非常聪明的同事的帮助下,我在Objective Caml和Haskell中编写了一个数据流优化库.Haskell版本更具多态性,具有更多的编译时类型检查,因此运行时检查更少.OCaml版本使用可变状态来累积数据流事实,本周可能更快或更慢,具体取决于月相.关键的事实是,在他们的预期应用程序中,两个库都非常快,以至于它们不值得愚弄.也就是说,在各自的编译器(Quick C--GHC)中,在数据流优化中花费的时间很少,因此代码不值得改进.

标杆是地狱.

  • 你只谈论吞吐量,他想要延迟. (9认同)
  • C--的链接似乎已经死了,现在自动重定向到关于护肤行业的博客...... (2认同)

igo*_*ouy 24

我写了很多实时地形渲染引擎,所以这是一个熟悉的主题.

熟悉,知道大部分时间花在哪里?

如果是这样,那么也许你可以编写代码,只是那部分在不同的语言和比较.

但是根据计算机语言基准游戏Haskell经常击败OCaml,如果只是相当小的分数 - 仍然存在问题,这个基准测试只需要非常具体的样本.

基准测试游戏报告了4组结果 - 一个核心和四核,32或64位Ubuntu - 你可能会发现OCaml或Haskell基准测试程序的性能越来越差,具体取决于平台.

所有基准测试都可以采用非常具体的样本,当然,您应该忽略与大多数时间将花费在您的应用程序中的任务的比较 - 大整数算术?正则表达式?字符串? - 并查看与您打算做的最相似的比较.

  • >>当数据结构发生变化时......很多<<那么你能把这个"有趣的部分"作为性能实验的基础吗?这足以解决与在这些实现语言之间进行选择相关的风险吗? (2认同)

Chu*_*uck 19

根据我看到的所有数据,它们大致相当.您编写的代码将比语言本身产生更大的差异.

  • 这不是足够的理由. (39认同)
  • 作为stackoverflow的解放公民,我保留以我认为合适的方式投票的权利.:-P (14认同)
  • 确实.在未来,我将按照luqui的例子,向我推荐任何我不喜欢的答案,就像"Ender的游戏"一样.你被警告过,Stack Overflow!(但是说真的,我也更喜欢igouy的回答.) (7认同)
  • @Chuck,我更喜欢igouy的回答. (4认同)

Jon*_*rop 19

有趣的问题.这个全行星地形渲染器是我在迁移到OCaml之前用C++编写的最后一个程序之一.回想起来,使用OCaml编写程序要比使用C++容易得多.Haskell应该让它变得相对容易,但是在Haskell中编程通常难得.理论上,Haskell对多核的支持更好,但实际上,即使是专家也很少使用Haskell进行并行编程.

此外,对于实时应用程序,您还需要来自垃圾收集器的低暂停时间.OCaml有一个很好的增量收集器,导致几乎没有超过30ms的暂停,但是,IIRC,GHC有一个停止世界的收集器,导致任意长的暂停.

我假设您使用Linux或F#将是比OCaml或Haskell更好的选择.

编辑:如果你想研究枪战,那么请务必阅读源代码.您可能还会发现有关它Haskell维基页面.

  • @Yttril:我同意除了"理论上Haskell应该扼杀所有懒惰和纯粹功能的东西,在实践中似乎很难找到好的优化".为什么有人会这么想?这不仅仅是Lisp重新审视的"足够聪明的编译器"神话吗? (8认同)
  • @FUZxxl:这正是我的意思.你永远不需要在实践中看看OCaml的中间代表. (4认同)
  • 但这是Ocaml设计模型之间的权衡:渴望,基本上是确定性的,并且专门设计了可视化成本管理的想法(即程序员可以从代码中看到成本,如C),以及更高级别的语言,如Haskell原则上具有极其低效的实现模型,并且在很大程度上依赖于不可见的优化.从理论上讲,Haskell应该扼杀所有懒惰和纯粹功能的东西,在实践中似乎很难找到好的优化. (4认同)
  • 我认为,为Haskell优化程序并不困难,但通常不那么明显.比如整个懒惰的事情,你经常要看核心才能理解,最新情况如何.PS:我没有投票. (3认同)