in reply to Re: Shuffling CODONS
in thread Shuffling CODONS
Why is that a favorite? I get it'll shuffle anything correctly, but trading O(NlogN) for O(1) is painful:
#! 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 ); ], }
Benchmark:
Rate tybalt buk1 buk2 ListUtil tybalt 224/s -- -65% -70% -97% buk1 644/s 187% -- -14% -91% buk2 746/s 233% 16% -- -90% ListUtil 7342/s 3176% 1040% 884% -- C:\test>shufflesBenchmark2018.pl -SIZE=1e3 Rate tybalt buk1 buk2 ListUtil tybalt 229/s -- -66% -70% -97% buk1 675/s 195% -- -13% -91% buk2 776/s 238% 15% -- -89% ListUtil 7339/s 3102% 987% 846% -- C:\test>shufflesBenchmark2018.pl -SIZE=1e4 Rate tybalt buk1 buk2 ListUtil tybalt 17.2/s -- -75% -78% -98% buk1 67.5/s 292% -- -13% -90% buk2 77.2/s 349% 14% -- -89% ListUtil 704/s 3992% 944% 812% -- C:\test>shufflesBenchmark2018.pl -SIZE=1e5 (warning: too few iterations for a reliable count) Rate tybalt buk1 buk2 ListUtil tybalt 1.21/s -- -81% -84% -98% buk1 6.40/s 430% -- -15% -89% buk2 7.53/s 523% 18% -- -87% ListUtil 56.4/s 4566% 781% 649% --
|
|---|