#! perl -slw use strict; use Benchmark qw[ cmpthese ]; use List::Util qw[ shuffle ]; use Data::Dump qw[ pp ]; sub buk1 { $a = $_ + rand @_ - $_ , $b = $_[$_], $_[$_] = $_[$a], $_[$a] = $b for 0 .. $#_; return @_; } sub buk2 { die 'Need array reference' unless ref( $_[0] ) eq 'ARRAY'; our( @aliased, $a, $b ); local( *aliased, $a, $b ) = $_[0]; $a = $_ + rand @aliased - $_, $b = $aliased[ $_ ], $aliased[ $_ ] = $aliased[ $a ], $aliased[ $a ] = $b for 0 .. $#aliased; return; } sub tybalt { map $_->[0], sort { $a->[1] <=> $b->[1] } map [ $_, rand ], @_; } our $SANITY //= 0; if( $SANITY ){ my %tests; my @test = 1 .. 4; buk2( \@test ), ++$tests{ buk2 }{ join ' ', @test } for 1 .. 10000; ++$tests{ buk1 }{ join ' ', buk1( @test ) } for 1 .. 10000; ++$tests{ tybalt }{ join ' ', tybalt( @test ) } for 1 .. 10000; ++$tests{ ListUtil }{ join ' ', shuffle( @test ) } for 1 .. 10000; pp \%tests; } our $SIZE //= 100; our @array = 1 .. $SIZE; cmpthese -1, { buk1 => q[ my @shuf = buk1( @array ); ], buk2 => q[ buk2( \@array ) ], tybalt => q[ my @shuf = tybalt( @array ); ], ListUtil=> q[ my @shuf = shuffle( @array ); ], }