#!/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; }