我正在尝试对c和ocaml进行基本的微基准测试比较。我听说对于fibonacci程序,c和ocaml大致相同,但我不能复制这些结果。我用gcc -O3 fier.c -o编译c代码,用ocamlopt -o ocaml-code fibo.ml编译OCaml代码。我使用time ./c-code和time ./ocaml-code来计时。每次我这样做,OCaml都需要0.10秒,而c代码每次大约需要0.10秒。除了这是一个天真的基准之外,有没有办法让ocaml更快?有人能看到他们电脑上的时间吗?
C
#include <stdio.h>
int fibonacci(int n)
{
return n<3 ? 1 : fibonacci(n-1) + fibonacci(n-2);
}
int main(void)
{
printf("%d", fibonacci(34));
return 0;
}OCaml
let rec fibonacci n = if n < 3 then 1 else fibonacci(n-1) + fibonacci(n-2);;
print_int(fibonacci 34);;发布于 2011-01-17 14:10:04
当用gcc -O2编译时,ML版本已经超过了C版本,我认为这是一项相当不错的工作。看一下gcc -O3生成的程序集,看起来gcc正在进行一些积极的内联和循环展开。为了让代码更快,我认为你必须重写代码,但你应该专注于更高层次的抽象。
发布于 2011-01-18 13:37:23
我认为这只是ocaml的开销,与更大的程序相比会更相关。
您可以使用-S选项生成程序集输出,还可以使用-verbose查看ocaml如何调用外部应用程序(gcc)。此外,使用-p选项并通过gprof运行您的应用程序将有助于确定这是ocaml的开销,还是您可以实际改进的东西。
干杯。
对于我的计算机,我得到了以下内容,
ocaml - 0.035 (std-dev=0.02; 10 trials)
c - 0.027 (std-dev=0.03; 10 trials) https://stackoverflow.com/questions/4709266
复制相似问题