Benchmarks

Under udviklingen af min Scheme, har målet hele tiden været at slå GNUs Scheme Guile, hvilket jeg endnu ikke gør. Guile er stadig over dobbelt så hurtig som min implementation.

Men hvor hurtig er Guile og min Scheme i forhold til at andre fortolkede sprog? Er Perl og Python og Ruby to eller ti gange hurtigere end Guile? I hvert sprog kodede jeg en lille benchmark test, som udregner de første 36 Fibonacci tal.

Nedenstående er benchmarken i hhv. Ruby, Perl, Python og Scheme.

def fib(n) if n < 2 n else fib(n-1) + fib(n-2) end end 36.times do |i| puts "#{i} : #{fib(i)}" end

sub fib { my $n = shift; if ($n < 2) { return $n } else { return fib($n-1) + fib($n-2); } } foreach my $i (0..35) { print "$i : ".fib($i)."\n"; }

def fib(n): if n < 2: return n else: return fib(n-1) + fib(n-2) for i in range(36): print "%d : %d" % (i, fib(i))

(define (fib n) (if (< n 2) n (+ (fib (- n 1)) (fib (- n 2))))) (do ((i 0 (+ i 1))) ((= i 36)) (display i) (display " : ") (display (fib i)) (newline))

Algorithen er meget dum og genererer en masse funktions-kald og garbage. En af Scheme's forcer er tail-call optimering, hvilket dog ikke er muligt i denne algoritme (da plus-operatoren venter på resultaterne), så sammenligningen er, omend ikke særlig videnskabelig, så ihvertfald fair i den sammenhæng. Algoritmen er ikke den smarteste måde at udregne Fibonacci tal på. En simpel iteration over n ville være meget meget hurtigere, men jeg gik efter noget langsomt til denne test. Udførselstiderne er som følger. Lavest tid er bedst.
SprogVersionTid
Guile1.8.130.73s
Python2.5.136.45s
Raygay0.5.072.50s
Perl5.8.874.30s
Ruby1.8.6183.87s

Min upræcise benchmark giver følgende upræcise konklusioner: min Scheme, Raygay, er hurtigere end Perl! Python er dobbelt så hurtigt som Perl - interessant. Så det passer at Ruby er sløvt. Guile er hurtigst af alle, så det giver heldigvis mening at have den som mål.