[jcw@linux jcw]$ perl q.pl Benchmark: running max_dkubb1, max_jcwren1, max_jcwren2, max_jcwren3, max_jcwren4, max_tilly, each for at least 3 CPU seconds... max_jcwren1: 5 wallclock secs ( 2.95 usr + 0.05 sys = 3.00 CPU) @ 26010.00/s (n=78030) max_jcwren2: 6 wallclock secs ( 3.23 usr + 0.00 sys = 3.23 CPU) @ 9057.59/s (n=29256) max_jcwren3: 5 wallclock secs ( 3.00 usr + 0.00 sys = 3.00 CPU) @ 53767.33/s (n=161302) max_jcwren4: 5 wallclock secs ( 3.01 usr + 0.00 sys = 3.01 CPU) @ 11827.24/s (n=35600) max_dkubb1: 5 wallclock secs ( 3.00 usr + 0.00 sys = 3.00 CPU) @ 2165.67/s (n=6497) max_tilly: 5 wallclock secs ( 3.00 usr + 0.00 sys = 3.00 CPU) @ 1711.33/s (n=5134) [jcw@linux jcw]$ #### #!/usr/local/bin/perl -w use Algorithm::Numerical::Shuffle qw(shuffle); use Benchmark qw(timethese); #Randomize the array contents my @array = shuffle 0..1000; timethese(-3, { max_jcwren1 => sub { max_jcwren1(@array) }, max_jcwren2 => sub { max_jcwren2(@array) }, max_jcwren3 => sub { maxarray1(@array) }, max_jcwren4 => sub { maxarray2(\@array) }, max_dkubb1 => sub { max_dkubb1(@array) }, max_tilly => sub { max_tilly(@array) }, }); use Inline C => <<'END_OF_C_CODE'; int maxarray1(SV* array1, ...) { Inline_Stack_Vars; int max = 0; int i, j; for (i = 0; i < Inline_Stack_Items; i++) if ((j = (SvIV(Inline_Stack_Item(i)))) > max) max = j; return (max); } int maxarray2(SV* array_ref) { AV* array; int num_items; int max = 0; int i, j; if (! SvROK(array_ref)) croak("array_ref is not a reference"); array = (AV*)SvRV(array_ref); num_items = av_len(array); for (i = 0; i <= num_items; i++) if ((j = (SvIV(*av_fetch (array, i, 0)))) > max) max = j; return (max); } END_OF_C_CODE sub max_jcwren1 { return maxarray1 (@_); } sub max_jcwren2 { return maxarray2 (\@_); } sub max_dkubb1 { my $max = shift; $max < $_ and $max = $_ for @_; return $max; } sub max_tilly { my $max = shift; $max = $max < $_ ? $_ : $max for @_; return $max; }