"Andy Bach" <[EMAIL PROTECTED]> schrieb im Newsbeitrag
[EMAIL PROTECTED]">news:[EMAIL PROTECTED]...
| and checking on perl's results found it sort of in the middle.
| http://www.bagley.org/~doug/shootout/lang/perl/

Come on. Without being the greatest of programmers, it took me five minutes
to improve the performance of the Fibonacci numbers Perl algorithm by
light-years!

Who would use a recursive algorithm when performance and memory usage are
critical?

#!/usr/bin/perl
use strict;
use integer;
use Benchmark;

# from Leif Stensson (used by the shootout)
sub fib {
    return $_[0] < 2 ? 1 : fib($_[0]-2) + fib($_[0]-1);
}
# mine:
sub fib2 {
    my($fib1,$fib2) = (1,1);
    foreach (1..$_[0]-1) {
       my $tmp = $fib2;
       $fib2   = $fib1;
       $fib1   = $fib1 + $tmp;
    }
    return $fib1;
}
sub fib3 {
    my($fib1,$fib2) = (1,1);
    my $i = 1;
    while ($i++ < $_[0]) {
       my $tmp = $fib2;
       $fib2   = $fib1;
       $fib1   = $fib1 + $tmp;
    }
    return $fib1;
}

my $N = 8;
timethese(
    -10, {
       leif_8 => "fib($N)",
       sm2_8  => "fib2($N)",
       sm3_8  => "fib3($N)",
    }
);

$N = 24;
timethese(
    -10, {
       leif_24 => "fib($N)",
       sm2_24  => "fib2($N)",
       sm3_24  => "fib3($N)",
    }
);

$N = 32;
timethese(
    -10, {
       leif_32 => "fib($N)",
       sm2_32  => "fib2($N)",
       sm3_32  => "fib3($N)",
    }
);

###

Benchmark: running leif_8, sm2_8, sm3_8, each for at least 10 CPU seconds...
leif_8: 11 wallclock secs (10.52 usr +  0.00 sys = 10.52 CPU)
        @ 5461.91/s (n=57432)
 sm2_8: 13 wallclock secs (10.63 usr +  0.01 sys = 10.64 CPU)
        @ 47485.47/s (n=505008)
 sm3_8: 18 wallclock secs (10.58 usr +  0.00 sys = 10.58 CPU)
        @ 49838.55/s (n=527541)

Benchmark: running leif_24, sm2_24, sm3_24, each for at least 10 CPU
seconds...
leif_24: 13 wallclock secs (10.14 usr +  0.00 sys = 10.14 CPU)
         @  2.46/s (n=25)
 sm2_24: 16 wallclock secs (10.39 usr +  0.00 sys = 10.39 CPU)
         @ 20469.86/s (n=212600)
 sm3_24: 15 wallclock secs (10.23 usr +  0.00 sys = 10.23 CPU)
         @ 18383.47/s (n=187971)

Benchmark: running leif_32, sm2_32, sm3_32, each for at least 10 CPU
seconds...
leif_32: 26 wallclock secs (19.17 usr +  0.00 sys = 19.17 CPU)
         @  0.05/s (n=1)
         (warning: too few iterations for a reliable count)
 sm2_32: 18 wallclock secs (10.53 usr +  0.00 sys = 10.53 CPU)
         @ 15836.48/s (n=166679)
 sm3_32: 12 wallclock secs (10.53 usr +  0.00 sys = 10.53 CPU)
         @ 13904.23/s (n=146342)

Steffen
--
@n=(544290696690,305106661574,116357),$b=16,@c=' ,JPacehklnorstu'=~
/./g;for$n(@n){map{$h=int$n/$b**$_;$n-=$b**$_*$h;$c[@c]=$h}c(0..9);
push@p,map{$c[$_]}@c[c($b..$#c)];$#c=$b-1}print@p;sub'c{reverse @_}


Reply via email to