($a =~ /(\d+)/)[0] <=> ($b =~ /(\d+)/)[0] #### #!/usr/bin/perl use strict; use warnings; sub compare; my @l; for (10, 100, 1000) { @l = map { "a$_" } 1..$_; compare "Pre-sorted"; @l = reverse @l; compare "Reverse-sorted"; use List::Util qw(shuffle); @l = shuffle @l; compare "Shuffled"; } my %regexes; sub brute_force { my $c = 0; my @s = sort { $c += 2; ($a =~ /(\d+)/)[0] <=> ($b =~ /(\d+)/)[0] } @l; push @{$regexes{force}}, $c; } sub ST { my $c = 0; my @s = map { $_->[1] } sort { $a->[0] <=> $b->[0] } map { $c += 1; /(\d+)/; [ $1, $_ ] } @l; push @{$regexes{ST}}, $c; } sub compare { use Benchmark qw(cmpthese); my $title = shift; my $len = @l; $title = "$title ($len)."; print $title, "\n"; print '-' x length $title, "\n"; %regexes = (); cmpthese(-1, { force => \&brute_force, ST => \&ST, } ); for (qw(force ST)) { use List::Util qw(sum); my $avg = sum(@{$regexes{$_}}) / @{$regexes{$_}}; printf "%10s %d regexes\n", $_, $avg; } print "\n"; } #### Pre-sorted (10). ---------------- Rate force ST force 34461/s -- -10% ST 38399/s 11% -- force 38 regexes ST 10 regexes Reverse-sorted (10). -------------------- Rate ST force ST 39097/s -- -5% force 41353/s 6% -- force 30 regexes ST 10 regexes Shuffled (10). -------------- Rate force ST force 26795/s -- -25% ST 35544/s 33% -- force 50 regexes ST 10 regexes Pre-sorted (100). ----------------- Rate ST force ST 4696/s -- -30% force 6698/s 43% -- force 198 regexes ST 100 regexes Reverse-sorted (100). --------------------- Rate ST force ST 4745/s -- -30% force 6761/s 43% -- force 198 regexes ST 100 regexes Shuffled (100). --------------- Rate force ST force 1347/s -- -59% ST 3257/s 142% -- force 1096 regexes ST 100 regexes Pre-sorted (1000). ------------------ Rate ST force ST 439/s -- -35% force 673/s 53% -- force 1998 regexes ST 1000 regexes Reverse-sorted (1000). ---------------------- Rate ST force ST 427/s -- -37% force 673/s 58% -- force 1998 regexes ST 1000 regexes Shuffled (1000). ---------------- Rate force ST force 86.3/s -- -64% ST 243/s 181% -- force 17440 regexes ST 1000 regexes