"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 @_}