什么是更高性能? Haskell或OCaml
我花了18个月的时间来掌握函数式编程,从学习OCaml开始,几个星期之后,Haskell开始了。 现在我想进行下一步并实现一些实际的应用程序:一个简单的实时地形编辑器。 我写了大量的实时地形渲染引擎,所以这是一个熟悉的话题。 而使用的recursionalgorithm和数据结构似乎非常适合于function实现。
随着这是一个实时应用程序,我自然而然地寻找我可以得到的最佳性能。 现在一些(恕我直言,非常恼人的)OCaml的支持者相对于OCaml或者F#来说,相对于Haskell来说相当慢。 但根据计算机语言基准游戏, Haskell经常击败OCaml,即使只有相当小的分数 – 仍然存在问题,这个基准只采取非常具体的样本。
正确的做法当然是用两种语言来实现这个程序,然后比较一下,但是我根本不想做双重工作。
但也许其他人在OCaml和Haskell做了类似的应用程序,并给出一些数字?
根据所有的说法,OCaml和Haskell几乎都具有足够的性能编译器和运行时间。 在纯粹的表演的基础上挑选他们似乎对我来说很愚蠢。 你已经走到了这么远 – 以更清晰,更简洁,更富有performance力,更高层次的代码的名义从最明显的低级和高性能的语言(C,C ++等)中走出来。 那么为什么当所涉及的性能差异更小时,现在转向那个标准呢?
如果你想要普遍的并行性,那么Haskell就是更好的select。 如果你想真正普遍的突变,那么OCaml更好。
如果你只想要非常粗糙的并行性,而且你打算坚持大部分的function结构,那就select其他的东西,比如语法(我认为Haskell在这里更好,但是这是主观的)或者可用的库(Haskell赢得了数量/可用性,但是OCaml可能会在graphics部门出现)。
我不认为你会出错
在两位非常聪明的同事的帮助下,我在Objective Caml和Haskell中编写了一个数据stream优化库。 Haskell版本更具多态性,具有更多的编译时types检查,因此运行时间检查更less。 OCaml版本使用可变状态来累积数据stream事实,这可能是本周更快或更慢,这取决于月亮的相位。 关键的事实是, 在他们预期的应用中,两个图书馆都是如此之快,以至于不值得与之搭档 。 也就是说,在各自的编译器( QuickC和GHC )中,数据stream优化花费的时间很less,代码不值得改进。
基准是地狱。
我写了大量的实时地形渲染引擎,所以这是一个熟悉的话题。
熟悉足够知道大部分时间将花费在哪里?
如果是这样,那么也许你可以用不同的语言编写代码,然后进行比较。
但根据计算机语言基准testing,Haskell经常击败OCaml,即使只有很小的分数 – 仍然存在问题,这个基准只采用非常具体的样本。
基准游戏报告了4组结果 – 一个核心和四核心 ,32位或64位Ubuntu – 你可能会发现OCaml或Haskell基准testing程序在不同的平台上performance更好或更差。
所有基准testing都可以采取非常具体的样本,当然,您应该忽略不同于大多数时间将花费在您的应用中的任务的比较 – 大整数算术? 正则expression式? string? – 看看最想做什么的比较。
根据我所看到的所有数据,它们大致相当。 你写的代码会比语言本身做出更大的改变。
有趣的问题。 在我移植到OCaml之前,这个全球地形渲染器是我用C ++编写的最后一个程序。 回顾一下,在OCaml中编写这个程序比C ++要容易得多。 Haskell应该比较容易,但是Haskell中的程序通常难以优化。 从理论上讲,Haskell对多核的支持更好,但实际上甚至专家也很less使用Haskell来获得体面的结果。
另外,对于实时应用程序,您还需要垃圾收集器的暂停时间较短。 OCaml有一个很好的增量收集器,导致30ms以上的暂停,但是,IIRC,GHC有一个停止世界的收集器,导致任意长的停顿。
我假设你使用Linux或F#将是一个比OCaml或Haskell更好的select。
编辑:如果你想研究枪战,那么确保你阅读的源代码。 你也可以find有关Haskell的wiki页面 。