什么是更高效的? Haskell或OCaml

时间:2010-11-29 21:10:12

标签: haskell benchmarking ocaml

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

这是一个实时应用程序,我自然而然地寻找可以获得的最佳性能。现在,与OCaml或F#相比,OCaml的一些(恕我直言,非常烦人)支持者反对Haskell的频率很慢。但是根据The Computer Language Benchmarks Game Haskell经常击败OCaml,如果只是相当小的分数 - 仍然存在问题,这个基准只需要非常具体的样本。

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

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

5 个答案:

答案 0 :(得分:59)

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

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

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

我认为你不会出错

答案 1 :(得分:38)

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

标杆是地狱。

答案 2 :(得分:24)

  
    

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

  

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

如果是这样,那么也许你可以用不同语言的那部分编写代码并进行比较。

  
    

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

  

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

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

答案 3 :(得分:19)

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

答案 4 :(得分:19)

有趣的问题。在迁移到OCaml之前,这个whole-planet terrain renderer是我用C ++编写的最后一个程序之一。回想起来,使用OCaml编写程序要比使用C ++容易得多。 Haskell应该让它变得比较容易,但程序通常在Haskell中更难以优化。从理论上讲,Haskell对多核的支持更好,但实际上,即使是专家也很少使用Haskell进行并行编程。

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

我认为你使用Linux或F#比OCaml或Haskell更好。

编辑:如果你想学习枪战,那么请务必阅读源代码。您可能还会发现Haskell wiki pages about it有趣。