Using a recursive version of the fibonacci function (with the integer 32 as an argument) to test function call overhead I get these timings for various languages and configurations:
perl 5.6.1 fib.pl 10.93 seconds python 2.2.2 fib.py 6.76 seconds parrot f.pasm 2.74 seconds parrot -j f.pasm 1.53 seconds parrot fib.imc (*) 22.07 seconds parrot -j fib.imc (*) 18.04 seconds Prototyped functions in Parrot have a huge runtime overhead as compared to normal subroutines. Is this to be expected? fib.imc is basically like parrot/examples/benchmarks/fib.imc except for 32 instead or 24 and s/var/pmc/g The changes were made because fib.imc in CVS did not compile. CVS parrot from yesterday running on Cygwin. Full source code and timings below. $ cat fib.pl #!/usr/bin/perl -w use strict; sub fib { my $n = shift; return 1 if ($n < 2); return fib($n-1) + fib($n-2); } my $N = 32; print fib($N), "\n"; $ time perl fib.pl 3524578 real 0m10.934s user 0m10.936s sys 0m0.015s $ cat fib.py import sys def fib(n): if (n < 2): return 1 return fib(n-2) + fib(n-1) def main(): N = 32; print fib(N) main() $ time python fib.py 3524578 real 0m6.765s user 0m6.749s sys 0m0.046s $ cat f.pasm _main: set I1, 32 bsr _fibo print I0 print "\n" end _fibo: ge I1, 2, FIB2 set I0, 1 ret FIB2: save I1 dec I1 bsr _fibo dec I1 save I0 bsr _fibo restore I3 add I0, I0, I3 restore I1 ret $ time ../../parrot f.pasm 3524578 real 0m2.743s user 0m2.749s sys 0m0.015s $ time ../../parrot -j f.pasm 3524578 real 0m1.530s user 0m1.546s sys 0m0.000s $ cat fib.imc .pcc_sub _main prototyped .param pmc argv .sym int argc argc = argv .sym int N N = 32 if argc <= 1 goto noarg $S0 = argv[1] N = $S0 noarg: .sym float start .sym pmc fib fib = newsub _fib time start .pcc_begin prototyped .arg N .pcc_call fib .sym int r .result r .pcc_end .sym float fin time fin print "fib(" print N print ") = " print r print " " sub fin, start print fin print "s\n" end .end .pcc_sub _fib prototyped .param int n if n >= 2 goto rec n = 1 .pcc_begin_return .return n .pcc_end_return rec: .sym int n1 .sym int n2 .sym int r1 .sym int r2 .sym pmc fib fib = P0 n1 = n - 1 n2 = n - 2 .pcc_begin prototyped .arg n1 .pcc_call fib .result r1 .pcc_end .pcc_begin prototyped .arg n2 .pcc_call fib .result r2 .pcc_end n = r1 + r2 .pcc_begin_return .return n .pcc_end_return .end $ time ../../parrot fib.imc fib(32) = 3524578 22.044000s real 0m22.078s user 0m22.077s sys 0m0.030s $ time ../../parrot -j fib.imc fib(32) = 3524578 18.017000s real 0m18.048s user 0m17.796s sys 0m0.030s __________________________________ Do you Yahoo!? New Yahoo! Photos - easier uploading and sharing. http://photos.yahoo.com/