【问题标题】:OCaml MicroBenchmarkOCaml 微基准
【发布时间】:2011-01-17 01:21:45
【问题描述】:

我正在尝试 c 与 ocaml 的基本微基准比较。我听说对于斐波那契程序,c 和 ocaml 大致相同,但我无法复制这些结果。我用 gcc -O3 fib.c -o c-code 编译 c 代码,用 ocamlopt -o ocaml-code fibo.ml 编译 OCaml 代码。我使用时间 ./c-code 和 time ./ocaml-code 来计时。每次我这样做 OCaml 需要 0.10 秒,而 c 代码每次大约需要 0.03 秒。除了这是一个幼稚的基准这一事实之外,有没有办法让 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);;

【问题讨论】:

  • 你看过this very similar question 吗?它包括 ocaml 的详细基准测试结果,以及测试代码的链接。
  • 是的,我已经看过了。我运行了大约 0.05 秒的 C 代码,而 ocaml 代码是 0.15 秒。

标签: c benchmarking ocaml


【解决方案1】:

当使用gcc -O2 编译时,ML 版本已经击败了 C 版本,我认为这是一个相当不错的工作。查看gcc -O3 生成的程序集,看起来gcc 正在执行一些激进的内联和循环展开。为了使代码更快,我认为您必须重写代码,但您应该专注于更高级别的抽象。

【讨论】:

    【解决方案2】:

    我认为这只是 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)  
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-18
      • 2013-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多