#!/usr/bin/perl -slw use strict; use List::Util qw[ shuffle ]; use Benchmark qw/:all/; sub naive (@) { my @l=@_; for (reverse 1..$#l) { my $r=int rand($_+1); @l[$_,$r]=@l[$r,$_]; } @l; } sub listutil (@) { my @a=\(@_); my $n; my $i=@_; map { $n = rand($i--); (${$a[$n]}, $a[$n] = $a[$i])[0]; } @_; } sub buk (@) { my @a = \( @_ ); my $n; my $i = @_; map+( $n = rand($i--), ${ $a[ $n ] }, $a[ $n ] = $a[ $i ] )[ 1 ], @_; } sub bukNew ($) { my( $ref ) = @_; my @x = 0 .. $#$ref; @{ $ref }[ map splice( @x, rand @x, 1 ), @x ]; } #my %stats; #++$stats{ join' ', bukNew( ['A'..'D'] ) } for 1 .. 1e4; #print "$_ => $stats{ $_ }" for sort keys %stats; sub blokhead (@) { my @a = (0 .. $#_); my $i = @_; my $n; map+( $n=rand($i--), $_[$a[$n]], $a[$n]=$a[$i] )[ 1 ], @_; } sub blokhead_ref ($) { my( $ref ) = @_; my @a = (0 .. $#$ref); my $i = @$ref; my $n; map+( $n=rand($i--), $ref->[$a[$n]], $a[$n]=$a[$i] )[ 1 ], @a; } #%stats = (); #++$stats{ join' ', blokhead_ref( ['A'..'D'] ) } for 1 .. 1e4; #print "$_ => $stats{ $_ }" for sort keys %stats; for my $c ( map{ 10**$_ } 1..3 ) { for my $l ( map{ 10**$_ } 0.1, 1, 3 ) { print "\n$c strings length $l"; our @test = map $_ x $l, 1..$c; cmpthese -3, { bukNew => q[ bukNew( \@test ) ], blokhead => q[ blokhead_ref( \@test ) ], map { $_ => "$_ \@test" } qw/naive listutil blokhead buk/ }; } }