This is surprising, interesting and pleasing...
There's some example NQP code to time calculating Fibonacci sequences.
I've tweaked it a tiny bit to take an optional count on the command line.
Unfortunately the NQP JVM prototype doesn't yet set @ARGS, so this isn't that
useful. Anyway, the code is:
$ cat ~/Perl/rakudo/nqp/examples/fib.nqp
#! nqp
sub fib($n) {
$n < 2 ?? $n !! fib($n-1) + fib($n - 2);
}
my $N := @ARGS > 1 ?? @ARGS[1] !! 29;
my $t0 := nqp::time_n();
my $z := fib($N);
my $t1 := nqp::time_n();
nqp::say("fib($N) = " ~ fib($N));
nqp::say("time = " ~ ($t1-$t0));
Running with NQP (optimised build):
$ nqp ~/Perl/rakudo/nqp/examples/fib.nqp
fib(29) = 514229
time = 3.15967702865601
Running with the NQP JVM prototype:
$ nqp nqp-jvm-cc.nqp ~/Perl/rakudo/nqp/examples/fib.nqp
fib(29) = 514229
time = 0.42100000381469727
That's about 8 times faster. (Even including all the compiling, right now
it's actually still faster. About 2.5 times faster)
And the equivalent Perl 5 code:
$ cat ~/test/fib.pl
#! perl
use Time::HiRes 'time';
sub fib {
my $n = shift;
$n < 2 ? $n : fib($n-1) + fib($n - 2);
}
my $N = @ARGV > 1 ? $ARGV[0] : 29;
my $t0 = time;
my $z = fib($N);
my $t1 = time;
print "fib($N) = " . fib($N) . "\n";
print "time = " . ($t1-$t0) . "\n";
$ ~/Sandpit/5162/bin/perl5.16.2 ~/test/fib.pl
fib(29) = 514229
time = 0.544455051422119
So the NQP JVM prototype is about 1.5 faster at running that code than Perl
5. That's without any sort of tuning of its code generator.
That's quite impressive.
Well done Jonathan. Please don't stop :-)
Nicholas Clark