【发布时间】:2010-11-29 21:10:12
【问题描述】:
在过去的 18 个月里,我一直在掌握函数式编程,从学习 OCaml 开始,现在又花了几周时间学习 Haskell。现在我想进行下一步并实现一些实际应用程序:一个简单的实时地形编辑器。我已经编写了许多实时地形渲染引擎,所以这是一个熟悉的话题。而且使用的递归算法和数据结构似乎非常适合函数式实现。
由于这是一个实时应用程序,我自然会寻找我能获得的最佳性能。现在一些(恕我直言)OCaml 的支持者经常抱怨 Haskell 比 OCaml 或 F# 慢。但是根据The Computer Language Benchmarks GameHaskell 经常击败 OCaml,即使只是很小的一部分 - 仍然存在问题,这个基准测试只需要非常具体的样本。
正确的做法当然是用两种语言实现程序并进行比较,但我只是不想做双重工作。
但也许其他人在 OCaml 和 Haskell 中做了类似的应用程序并给出了一些数据?
【问题讨论】:
-
@Trufa,我敢说 DRY 原则适用于比整个应用程序更小的“粒度”;在方法或类级别上会更有意义。我同意 OP 的观点,即您只能在两种语言和平台本质上做完全相同的事情时直接比较两种语言和平台——但当然,这是一种相当极端的发现方式,在大多数情况下不太实用。
-
@Trufa:写两个等价的程序来比较它们的性能特点,和DRY的原理无关。 DRY 是关于一条信息有一个规范的来源,而不是很多独立的来源。在这种情况下,两个程序本身都不包含必要的信息,所以只有当你已经编写了比较并且出于某种神秘的原因考虑再次编写它时,DRY 才会发挥作用。两个是比较所需的最少程序数,所以我看不出它可能是“明显低效”的。
-
语言基准测试游戏最近在 OCaml 邮件列表上引起了一些争议——一些规则似乎比其他规则对 OCaml 的影响更大。例如 OCaml 二叉树代码在 47 秒内运行。在“有趣的替代方案”部分中找到的 OCaml 树代码在 12.67s 中运行,这将使其排在 C 之后的第二位。alt 代码调整垃圾收集器,我猜这违反了二叉树代码的规则。我无法评论 Haskell 是否比 OCaml 更快,但用于基准测试的一些代码不是最佳的。
-
@Niki Yoshiuchi,二叉树基准测试对 Haskell 的影响也很严重,因为不允许使用惰性树。
-
主要的兴趣点肯定是 OCaml 的增量 GC 会导致平均 10 毫秒的暂停,最长可达 30 毫秒(对于表现良好的代码),而 GHC 的 stop-the-world GC 会导致任意长的暂停。令人惊讶的是,除了我之外,没有其他人提到过这一点,我的麻烦被投了 3 票……
标签: haskell benchmarking ocaml