use Inline 'C'; use Benchmark 'cmpthese'; cmpthese( 1_000_000, { iterative_c => sub{guess_it_c(4999,1,10000)}, recursive_c => sub{guess_rec_c(4999,1,10000)}, iterative_p => sub{guess_it_p(4999,1,10000)}, recursive_p => sub{guess_rec_p(4999,1,10000)},}); sub guess_it_p { my ( $ans, $lower, $higher ) = @_; my $guess; while(1) { $guess = int(($lower + $higher)/2); last if $ans == $guess; if ( $guess > $ans ) { $higher = $guess -1; } else { $lower = $guess +1; } } return $guess; } sub guess_rec_p { my ( $ans, $lower, $higher ) = @_; my $guess = int(($lower + $higher)/2); if ($ans == $guess) { return $guess; } if ( $guess > $ans ) { guess_rec_p( $ans, $lower, $guess -1 ); } else { guess_rec_p( $ans, $guess +1, $higher ); } } __END__ __C__ int guess_it_c( int ans, int lower, int higher ) { int guess; for(;;) { guess = (int)((lower + higher)/2); if ( ans == guess ) break; if ( guess > ans ) higher = guess -1; else lower = guess +1; } return guess; } int guess_rec_c( int ans, int lower, int higher ) { int guess; guess = (int)((lower + higher)/2); if (ans == guess) return guess; if ( guess > ans ) { guess_rec_c( ans, lower, guess -1 ); } else { guess_rec_c( ans, guess +1, higher ); } }