I implemented the same variable argument function "varargs_adder"
in both Perl 5 (addit.pl) and Parrot (f4.pasm).
The variable arguments can be strings, integers or floats
(I wanted to excercise dynamic variable behavior).
I called the function 500000 times in a loop to benchmark it.
The results are not what I expected:
Perl 5.6.1: 2.79 seconds
Parrot (non jit) 5.04 seconds
Parrot (jit) 13.65 seconds
Also note that the jitted version produces the wrong result
(21001094.100000 versus 21001097.970000)
I also tried using invokecc/foldup for the varargs function
(not included) but the results were much slower still.
Parrot was built from latest CVS yesterday on Cygwin/Windows.
$ cat addit.pl
#!/usr/bin/perl
#
# addit.pl
#
use strict;
sub varargs_adder {
my $sum = 0;
for (my $a = $#_; $a >= 0; --$a) {
$sum += $_[$a];
}
return $sum
}
my $result = 0;
for (my $x = 500000; $x >= 0; --$x) {
$result = varargs_adder(1000, 7.100, 87, "3.87", "21000000");
}
print "$result\n";
$ time perl addit.pl
21001097.97
real 0m2.790s
user 0m2.796s
sys 0m0.015s
$ cat f4.pasm
#
# f4.pasm
#
_main:
set I9, 500000
AGAIN:
dec I9
lt I9, 0, FIN
new P5, .SArray
set P5, 5
push P5, 1000
push P5, 7.100
push P5, 87
push P5, "3.87"
push P5, "21000000"
bsr _varargs_adder
branch AGAIN
FIN:
print N0
print "\n"
end
_varargs_adder:
new P2, .PerlNum
assign P2, 0
set I1, P5
LOOP:
dec I1
lt I1, 0, DONE
set P1, P5[I1]
add P2, P2, P1
branch LOOP
DONE:
set N0, P2
ret
$ time parrot f4.pasm
21001097.970000
real 0m5.040s
user 0m5.046s
sys 0m0.015s
$ time parrot -j f4.pasm
21001094.100000
real 0m13.652s
user 0m13.655s
sys 0m0.015s
__________________________________
Do you Yahoo!?
New Yahoo! Photos - easier uploading and sharing.
http://photos.yahoo.com/