#!/usr/bin/perl -w use strict; use Benchmark qw(cmpthese); use Data::Dumper; sub xform { map {$_->[0]} sort { $a->[1] <=> $b->[1]} map {[$_, rand(1)]} @_; } sub slice { my @random; push @random, rand 1 for 0 .. $#_; @_[ sort { $random[$a] <=> $random[$b] } 0 .. $#_ ]; } sub shufl { $a = $_ + rand @_ - $_ and @_[$_, $a] = @_[$a, $_] for (0..$#_); return @_; } sub qshuf { my @sorted = sort { .5 <=> rand(1) } @_; } my @array = 1 .. 1000; cmpthese(10000, { slice => sub { slice @array }, xform => sub { xform @array }, shufl => sub { shufl @array }, qshuf => sub { qshuf @array }, }); my (%buckets, %d, @temp);; my @set = qw(A B C D); for (1 .. 100_000 ) { $buckets{"@{[slice @temp=@set]}"}{slice}++; $buckets{"@{[xform @temp=@set]}"}{xform}++; $buckets{"@{[shufl @temp=@set]}"}{shufl}++; $buckets{"@{[qshuf @temp=@set]}"}{qshuf}++; } print "\npermutation | slice | xform | shufl | qshuf \n"; print "--------------------------------------------------\n"; for my $key (sort keys %buckets) { printf "%8.8s: | %4d | %4d | %4d | %4d\n", $key, $buckets{$key}{slice}, $buckets{$key}{xform}, $buckets{$key}{shufl}, $buckets{$key}{qshuf}; $d{slice}{Ex} += $buckets{$key}{slice}; $d{slice}{Ex2} += $buckets{$key}{slice}**2; $d{xform}{Ex} += $buckets{$key}{xform}; $d{xform}{Ex2} += $buckets{$key}{xform}**2; $d{shufl}{Ex} += $buckets{$key}{shufl}; $d{shufl}{Ex2} += $buckets{$key}{shufl}**2; $d{qshuf}{Ex} += $buckets{$key}{qshuf}; $d{qshuf}{Ex2} += $buckets{$key}{qshuf}**2; } print "---------------------------------------------------\n"; printf "Std. Dev. | %0.3f | %0.3f | %0.3f | %0.3f\n", sqrt( ($d{slice}{Ex2} - ($d{slice}{Ex}**2/24))/23 ), sqrt( ($d{xform}{Ex2} - ($d{xform}{Ex}**2/24))/23 ), sqrt( ($d{shufl}{Ex2} - ($d{shufl}{Ex}**2/24))/23 ), sqrt( ($d{qshuf}{Ex2} - ($d{qshuf}{Ex}**2/24))/23 ); __END__ P:\test>c:\perl561\bin\perl5.6.1.exe 200083.pl Benchmark: timing 10000 iterations of qshuf, shufl, slice, xform... qshuf: 24 wallclock secs (22.86 usr + 0.01 sys = 22.88 CPU) @ 437.16/s (n=10000) shufl: 15 wallclock secs (14.78 usr + 0.00 sys = 14.78 CPU) @ 676.54/s (n=10000) slice: 38 wallclock secs (36.69 usr + 0.00 sys = 36.69 CPU) @ 272.57/s (n=10000) xform: 56 wallclock secs (55.39 usr + 0.00 sys = 55.39 CPU) @ 180.53/s (n=10000) Rate xform slice qshuf shufl xform 181/s -- -34% -59% -73% slice 273/s 51% -- -38% -60% qshuf 437/s 142% 60% -- -35% shufl 677/s 275% 148% 55% -- permutation | slice | xform | shufl | qshuf -------------------------------------------------- A B C D: | 4168 | 4266 | 4233 | 12486 A B D C: | 4072 | 4170 | 4091 | 6165 A C B D: | 4232 | 4185 | 4159 | 6231 A C D B: | 4205 | 4169 | 4191 | 3151 A D B C: | 4285 | 4211 | 4031 | 3081 A D C B: | 4219 | 4124 | 4197 | 1549 B A C D: | 4204 | 4160 | 4248 | 12385 B A D C: | 4132 | 4164 | 4133 | 6241 B C A D: | 4147 | 4138 | 4346 | 6281 B C D A: | 4242 | 4166 | 4022 | 3086 B D A C: | 4174 | 4114 | 4075 | 3131 B D C A: | 4175 | 4173 | 4103 | 1556 C A B D: | 4236 | 4306 | 4194 | 6163 C A D B: | 4158 | 4236 | 4146 | 3068 C B A D: | 4095 | 4126 | 4278 | 6406 C B D A: | 4160 | 4092 | 4245 | 3104 C D A B: | 4141 | 4181 | 4150 | 1614 C D B A: | 4097 | 4175 | 4163 | 1620 D A B C: | 4167 | 4220 | 4246 | 3147 D A C B: | 4220 | 4057 | 4138 | 1593 D B A C: | 4095 | 4194 | 4192 | 3184 D B C A: | 4170 | 4131 | 4179 | 1636 D C A B: | 4054 | 4072 | 4159 | 1487 D C B A: | 4152 | 4170 | 4081 | 1635 --------------------------------------------------- Std. Dev. | 57.747 | 57.211 | 77.656 | 3126.744