use strict; use warnings; use Benchmark qw(cmpthese); sub tyesort { @_[ do { my @by = map { (split '\|:\|', $_, 2)[1] } @_; sort {$by[$a] cmp $by[$b]} 0..$#_ } ]; } sub mcsort { @_[ do { my %by; @by{ map { (split '\|:\|', $_, 2)[1] } @_ } = 0..$#_; @by{ sort keys %by }; } ]; } sub ahsort { map { my ($n,$t) = split '\|:\|', $_, 2; $t.'|:|'.$n } sort map { my ($n,$t) = split '\|:\|', $_, 2; $t.'|:|'.$n } @_; } sub stsort { map { $_->[0] } sort { $a->[1] cmp $b->[1] } map { my ($n,$t) = split('\|:\|',$_,2); [$_,$t] } @_; } for my $num (10, 25, 100, 250, 1000, 10000) { my $str = "aaaaa"; my @list = map { "$_|:|".$str++ } 0..$num; for (0..$#list) { my $i = int rand $_; @list[$_, $i] = @list[$i, $_]; } print "Comparing for $num elements\n"; cmpthese (-3, { ah => sub { ahsort(@list); }, mc => sub { mcsort(@list); }, st => sub { stsort(@list); }, tye => sub { tyesort(@list); } }); } #### RESULTS #### Comparing for 10 elements Rate st ah mc tye st 9664/s -- -10% -39% -40% ah 10762/s 11% -- -32% -33% mc 15789/s 63% 47% -- -2% tye 16049/s 66% 49% 2% -- Comparing for 25 elements Rate st ah tye mc st 3744/s -- -17% -40% -47% ah 4502/s 20% -- -28% -37% tye 6255/s 67% 39% -- -12% mc 7110/s 90% 58% 14% -- Comparing for 100 elements Rate st ah mc tye st 820/s -- -28% -37% -39% ah 1143/s 39% -- -12% -16% mc 1300/s 58% 14% -- -4% tye 1354/s 65% 18% 4% -- Comparing for 250 elements Rate st ah tye mc st 288/s -- -36% -39% -39% ah 451/s 56% -- -4% -5% tye 469/s 63% 4% -- -2% mc 476/s 65% 6% 2% -- Comparing for 1000 elements Rate st tye mc ah st 58.1/s -- -37% -40% -46% tye 92.9/s 60% -- -4% -13% mc 97.0/s 67% 4% -- -10% ah 107/s 85% 15% 11% -- Comparing for 10000 elements Rate mc st tye ah mc 1.39/s -- -59% -75% -82% st 3.38/s 142% -- -39% -56% tye 5.53/s 297% 64% -- -28% ah 7.70/s 452% 128% 39% --