2011-01-17 25 views
2

Ich versuche einen grundlegenden Mikrobenchmark Vergleich von c mit ocaml. Ich habe gehört, dass für das Fibonacci-Programm c und ocaml ungefähr gleich sind, aber ich kann diese Ergebnisse nicht replizieren. Ich kompiliere den c-Code mit gcc -O3 fib.c -o c-code und kompiliere den OCaml-Code mit ocamlopt -o ocaml-code fibo.ml. Ich Timing mit Zeit ./c-code und Zeit ./ocaml-code. Jedes Mal, wenn ich dies tue, dauert OCaml 0,10 Sekunden, während der c-Code jedes Mal etwa 0,03 Sekunden beträgt. Abgesehen davon, dass dies ein naives Benchmark ist, gibt es eine Möglichkeit, ocaml schneller zu machen? Kann jemand sehen, was die Zeiten auf ihren Computern sind?OCaml MicroBenchmark

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);; 
+0

Haben Sie sah [diese sehr ähnliche Frage] (http://stackoverflow.com/questions/4121790/stack-performance-in-programming-languages) Es enthält detaillierte Bench-Ergebnisse für Ocaml und Links zum Test-Code. – huitseeker

+1

Ja, ich habe mir das angesehen. Ich habe den C-Code ausgeführt, der etwa 0,05 Sekunden betrug, während der OCAML-Code 0,15 Sekunden lang war. – LTigger

Antwort

6

Die ML-Version schlägt bereits die C-Version, wenn sie mit gcc -O2 zusammengestellt, die ich denke, eine ziemlich gute Arbeit ist. Betrachtet man die Baugruppe, die von gcc -O3 erzeugt wird, sieht es so aus, als ob gcc ein aggressives Inlining und Loop-Abrolling ausführt. Um den Code schneller zu machen, müssten Sie den Code möglicherweise neu schreiben, aber Sie sollten sich stattdessen auf die Abstraktion auf höherer Ebene konzentrieren.

2

Ich denke, das ist nur ein Overhead zu ocaml, wäre es relevanter, mit einem größeren Programm zu vergleichen.

Sie können die Option -S verwenden, um eine Baugruppenausgabe zu erstellen, zusammen mit -verbose, um zu sehen, wie ocaml externe Anwendungen aufruft (gcc). Darüber hinaus hilft die Verwendung der Option -p und die Ausführung Ihrer Anwendung über gprof zu ermitteln, ob dies ein Overhead von ist, oder etwas, das Sie tatsächlich verbessern können.

Prost.

Für meinen Computer ich folgendes bekommen,

ocaml - 0.035 (std-dev=0.02; 10 trials) 
    c - 0.027 (std-dev=0.03; 10 trials)