use strict; use warnings; use Benchmark qw( cmpthese ); my @a = map { int rand 10 } 1..100; my @b = map { int rand 10 } 1..100; sub perl_for { my $dummy_load; for my $i (reverse 0..$#a) { $dummy_load = $a[$i] . ' ' . $b[$i]; } 1; } sub c_style_for { my $dummy_load; for (my $i=@a; $i--; ) { $dummy_load = $a[$i] . ' ' . $b[$i]; } 1; } sub while_loop { my $dummy_load; my $i = @a; while ($i--) { $dummy_load = $a[$i] . ' ' . $b[$i]; } 1; } sub ickyb0d { my $dummy_load; for my $i (0..$#a) { $dummy_load = $a[$#a-$i] . ' ' . $b[$#a-$i]; } 1; } sub ickyb0d_ { my $dummy_load; for (0..$#a) { my $i = $#a-$_; $dummy_load = $a[$i] . ' ' . $b[$i]; } 1; } sub diotalevi { my $dummy_load; for my $i (1..@a) { $dummy_load = $a[-$i] . ' ' . $b[-$i]; } 1; } cmpthese(-3, { perl_for => \&perl_for, c_style_for => \&c_style_for, while_loop => \&while_loop, ickyb0d => \&ickyb0d, ickyb0d_ => \&ickyb0d_, diotalevi => \&diotalevi, }); #### This is perl, v5.6.1 built for MSWin32-x86-multi-thread Rate ickyb0d ickyb0d_ perl_for diotalevi while_loop c_style_for ickyb0d 2516/s -- -8% -44% -48% -52% -52% ickyb0d_ 2726/s 8% -- -40% -43% -48% -48% perl_for 4507/s 79% 65% -- -6% -14% -14% diotalevi 4794/s 91% 76% 6% -- -9% -9% while_loop 5261/s 109% 93% 17% 10% -- -0% c_style_for 5261/s 109% 93% 17% 10% 0% --