for ( my $i = $size; $i--; ) { ... } for ( my $j = $i; $j--; ) { ... } #### foreach my $i ( 0 .. $size-1 ) { ... } foreach my $j ( $i+1 .. $size-1 ) { ... } #### foreach my $i ( 0 .. $size-1 ) { ... } foreach my $string2 { @{$arrayDocs}[ $i+1 .. $size-1 ] } { # change references to '$arrayDocs->[$j]' to '$string2' } #### # s/iter orig backwards foreach # orig 10.6 -- -45% -55% # backwards 5.80 83% -- -18% # foreach 4.75 123% 22% -- #### use Benchmark qw(cmpthese); my $size = 5000; my $orig = sub { for (my $i = 0; $i < ($size - 1); $i++) { for (my $j = $i + 1; $j < ($size - 1); $j++) { } } }; my $backwards = sub { for ( my $i = $size; $i--; ) { for ( my $j = $i; $j--; ) { } } }; my $foreach = sub { foreach my $i ( 0 .. $size-1 ) { foreach my $j ( $i+1 .. $size-1 ) { } } }; cmpthese ( 10 , { orig => $orig, backwards => $backwards, foreach => $foreach } );