【发布时间】:2011-05-06 12:38:57
【问题描述】:
只是为了好玩,我尝试比较几种使用朴素递归算法计算斐波那契数列的编程语言的堆栈性能。代码在所有语言中基本相同,我将发布一个java版本:
public class Fib {
public static int fib(int n) {
if (n < 2) return 1;
return fib(n-1) + fib(n-2);
}
public static void main(String[] args) {
System.out.println(fib(Integer.valueOf(args[0])));
}
}
好的,关键是使用这个算法和输入 40 我得到了这些时间:
C: 2.796s
Ocaml: 2.372s
Python: 106.407s
Java: 1.336s
C#(mono): 2.956s
它们是在双核英特尔机器上使用官方存储库中可用的每种语言版本的 Ubuntu 10.04 机器中获取的。
我知道像 ocaml 这样的函数式语言会因为将函数视为一等公民而导致速度变慢,并且没有问题解释 CPython 的运行时间,因为它是本次测试中唯一的解释语言,但我印象深刻的是java运行时间是相同算法的c的一半!您会将其归因于 JIT 编译吗?
你会如何解释这些结果?
编辑:感谢您的有趣回复!我认识到这不是一个合适的基准(从未说过它是:P),也许我可以根据我们讨论的内容做出更好的基准并在下次发布给您:)
编辑 2:我使用优化编译器 ocamlopt 更新了 ocaml 实现的运行时。我还在https://github.com/hoheinzollern/fib-test 上发布了测试平台。如果您愿意,请随时对其进行添加:)
【问题讨论】:
-
除了适用于基准测试的通常规则... (1) OCaml (native) 编译器 非常激进,在处理时不应比 C 慢六倍具有递归这样重要的FP概念。您是否使用了字节码解释器? (2) C 有哪些优化设置?
-
您是否执行了多个样本?您是否删除了异常值?你平均成绩了吗?您测量的是时钟时间还是 CPU 时间?你有没有听说过统计? :-)
-
令我惊讶的是java运行时间。我以前见过这个……在 C 和 Java 中做一个 Quicksort 方法,Java 每次都优于 C。
-
@paxdiablo:统计数据是在谎言和该死的谎言之后出现的,对吧? ;-)
-
@Nicholas:听起来有些可疑。很高兴看到您的 C 代码并知道您使用了哪些编译器和优化设置。
标签: java python c performance ocaml