($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