#!/usr/bin/perl use strict; use warnings; use Benchmark qw/timethese cmpthese/; my @letters = ('A' .. 'Z', 'a' .. 'z'); my $size = 1_000; my $max_l = 1_000; my @array = map {join "" => map {$letters [rand @letters]} 1 .. 1 + rand $max_l} 1 .. $size; my (@st_sorted, @simple_sorted, @grt_sorted); cmpthese -10 => { Schwartzian => \&sort_schwartzian, Simple => \&sort_simple, GRT => \&sort_grt, }; sub sort_schwartzian { @st_sorted = map { $_ -> [0] } sort { $a -> [1] cmp $b -> [1]} map {[$_ => uc $_ ] } @array; } sub sort_simple { @simple_sorted = sort {uc ($a) cmp uc ($b)} @array; } sub sort_grt { @grt_sorted = map {substr $_ => $max_l} sort map {uc () . ("\0" x ($max_l - length)) . $_} @array; } die "Unequal" unless "@st_sorted" eq "@simple_sorted" && "@st_sorted" eq "@grt_sorted"; __END__ Rate Simple Schwartzian GRT Simple 8.99/s -- -78% -81% Schwartzian 40.7/s 353% -- -15% GRT 48.2/s 436% 18% --