#!/usr/bin/perl use warnings; use strict; use Benchmark qw/:hireswallclock cmpthese/; my @ary = (0..5); my $len = $#ary; my @ary2 = @ary; print "ARRAY: @ary2\n"; # numbers -> strings #$_ += 0 foreach @ary2; # stings -> numbers #print "@ary\n"; cmpthese (-3, { 'intervals' => sub { foreach my $i (0..$len-1) { foreach my $j ($i+1..$len) { my @permuted = @ary[0..$i-1, $j, $i+1..$j-1, $i, $j+1..$len]; } } }, 'cross' => sub { foreach my $i (0..$len-1) { foreach my $j ($i+1..$len) { my @permuted = @ary; @permuted[$i, $j] = @permuted[$j, $i]; } } }, 'intervals2' => sub { foreach my $i (0..$len-1) { foreach my $j ($i+1..$len) { my @permuted = @ary2[0..$i-1, $j, $i+1..$j-1, $i, $j+1..$len]; } } }, 'cross2' => sub { foreach my $i (0..$len-1) { foreach my $j ($i+1..$len) { my @permuted = @ary2; @permuted[$i, $j] = @permuted[$j, $i]; } } }, }); #### Rate cross2 intervals2 intervals cross cross2 10490/s -- -2% -43% -55% intervals2 10742/s 2% -- -42% -54% intervals 18408/s 75% 71% -- -22% cross 23526/s 124% 119% 28% -- #### s/iter intervals2 cross2 intervals cross intervals2 48.2 -- -20% -63% -81% cross2 38.6 25% -- -54% -77% intervals 17.8 171% 117% -- -49% cross 9.02 434% 328% 97% --