有没有好的Clojure基准测试?

34

编辑: Clojure的基准测试已经在Benchmarks Game上发布。

我将这个问题设为社区wiki,邀请其他人进行更新。


有人知道Clojure性能的基准测试吗?

我自己做了一些(虽然没有太正式),与其他函数式语言(如Haskell和OCaml)相比表现不佳。但是与Java或JVM上的另一种语言(例如Scala)相比如何? 它与其他Lisp方言相比如何?

关于将Clojure添加到Computer Language Benchmarks Game上的论坛中有一些讨论,但尚未采取任何行动。

编辑: 我会继续添加内容:

@igouy指出,clojure的基准测试脚本正在Github上由jafingerhut创建

来自Clojure讨论组的两个非常相关的帖子:

还有一些相关的博客文章:

最后,还有一个在stackoverflow上相关的问题:

这些讨论使我认为与其他运行在JVM上的语言相比,Clojure的性能非常有优势,尽管比较语言的性能可能会因任务的不同而有很大差异,因此很难得出广泛结论。

编辑:

Lau Jensen在他的博客上发布了一篇关于在JVM语言中进行基准测试的好文章:“正确进行基准测试”


很难得出一个广泛的结论,因此尝试得出一个狭窄的结论。 - igouy
2
基准测试游戏花费了很多精力来展示“平均值”可以有多么不具代表性 - 这就是为什么不只有几何平均值 - 这就是为什么两种语言之间的比较是逐个测试的原因 - 这就是为什么许多语言之间的总体比较是一个带有四分位数和异常值的箱形图。你知道“性能会根据任务而大幅变化” - 利用你所知道的。 - igouy
1
@Shane - Lau Jensen似乎不再显示有关该博客文章的评论。对于JVM的“正确获取基准”的问题,请勿重复造轮子,使用JavaStats http://www.elis.ugent.be/JavaStats - igouy
2
请注意:http://shootout.alioth.debian.org/u32q/compare.php?lang=clojure - igouy
4
这是一个你可能想要阅读的东西:http://learnclojure.blogspot.com/2010/09/clojure-is-fast.html。 - nickik
显示剩余8条评论
5个回答

12

9

这是一个非常重要的问题,几乎每个人在考虑Clojure之前都会思考。即使对于那些不添加像分块序列这样彻底改变某些特定(但常见)任务性能的成熟语言来说,这也是一个难题。我在这篇文章中发现了一些好的想法。你能找到的很多基准测试都与Java和Clojure的旧版本有关,因此很少有人能够找到“真正好的基准测试”。

在这里问自己一个很好的问题是Java是否足够快。这是Clojure足够快的先决条件。如果你能让自己相信这个问题的答案是肯定的,那么就可以安全地使用Clojure并实现你的分析标识为瓶颈的部分。因为你有一个备选语言,它具有良好的已知性能,所以通常使用Clojure是安全的。


9

有关性能问题,请参考这篇博客文章:

http://meshy.org/2009/12/13/widefinder-2-with-clojure.html

这展示了WideFinder2挑战的Clojure实现,比Java、Scala和单线程C都要快。请与官方时间进行比较。

关于丹尼尔的评论,认为Clojure永远不可能更快,我们可以看到以上结果显然是错误的。可变性比不可变性更快,而Clojure默认是不可变的,但Clojure允许使用本地瞬态(即暂时可变数据),因此可以实现最佳速度。

请参考clj-me.cgrand.net获取许多优化技巧。

总之:Clojure可以像您想要的那样快,同时仍然允许您维护一个简单、优雅和强大的代码库,几乎是一种独特的组合。


5
很有意思的一篇阅读!我不确定从那个基准测试中得出 "Clojure 可以像你想要的一样快" 这个结论是否成立。作者对 Clojure 代码进行了很多优化,并承认同样的技巧也适用于 Java 和 Scala(例如,避免使用 Java 的 String.split())。这更表明反复优化的好处。但它确实表明了人们可以完全放心地在各种任务中使用 Clojure。 - Rex Kerr

3
您可能也对 Tim Bray 的 concur.next 系列感兴趣。他讨论了一些性能问题。

2
Clojure无法与Scala程序相匹配,后者在算法中充分利用可变性。此外,Clojure是一种动态语言,目前在JVM上的支持不太好。
另一方面,Clojure在实现并行、异步和分布式算法以及不可变算法方面表现出色。
因此,如果您需要(大部分)不可变性和多核效率,则Clojure将使其更容易实现。如果您的算法确实需要大量使用可变性以提高效率,则Scala将更容易实现。
对于介于两者之间的情况,两者可能都可以胜任。

4
Clojure可以与Java数组或Java集合一起使用,并且您可以使用类型提示。如果你真的需要的话,虽然有点困难,但是这是可能的。 - nickik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接