仅仅出于好玩,我尝试比较了一些编程语言在使用朴素递归算法计算斐波那契数列时的堆栈性能。代码在所有语言中基本相同,我会发布一个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上发布了测试平台。如果您愿意,请随意添加 :)