FYI, since we're running benckmarks:
#!/usr/bin/perl
use warnings;
use strict;
use Benchmark 'cmpthese';
use Sort::Naturally 'nsort';
use Sort::Key::Natural 'natsort';
my @data = grep /\S/, <DATA>;
sub normalize_digits {
my ( $key ) = @_;
$key =~ s/(\d+)/sprintf '%03d', $1/eg;
return $key;
}
cmpthese -10, {
SN_nsort => sub { my @s = nsort @data },
SKN_natsort => sub { my @s = natsort @data },
GRT_pack => sub { my @s =
map unpack( 'x3 a*', $_ ),
sort
map pack( 'n a a*', /(\d+)([A-Z])/, $_ ),
@data
},
ST_sub => sub { my @s =
map { $_->[ 0 ] }
sort { $a->[ 1 ] cmp $b->[ 1 ] }
map { [ $_, normalize_digits( $_ ) ] }
@data
},
GRT_sub => sub { my @s =
map { local $_ = $_; s/^.*\0//; $_ }
sort
map { normalize_digits( $_ ) . "\0$_" }
@data
},
GRT_sprintf => sub { my @s =
map { s/-0+/-/g; $_ }
sort
map { s/(\d+)/sprintf '%03d', $1/eg; $_ }
@data
},
};
__DATA__
K-2-D-10A
K-2-D-10C
K-2-D-10D
K-2-D-10E
K-2-D-10F
K-2-D-10G
K-2-D-11A
etc.
etc.
Which gave me these results:
Rate SN_nsort SKN_natsort ST_sub GRT_sub GRT_sprint
+f GRT_pack
SN_nsort 64.6/s -- -81% -90% -91% -93
+% -97%
SKN_natsort 341/s 427% -- -47% -51% -62
+% -82%
ST_sub 642/s 893% 88% -- -7% -29
+% -67%
GRT_sub 694/s 973% 104% 8% -- -23
+% -64%
GRT_sprintf 900/s 1292% 164% 40% 30% -
+- -53%
GRT_pack 1928/s 2883% 466% 200% 178% 114
+% --
:-)
|