#!/usr/bin/perl use strict; use warnings; no warnings 'numeric'; use Benchmark 'cmpthese'; for my $e (2..5) { my $n = 10**$e; print "\nNumber of file names: $n\n"; my @data; push @data, join(".", int(rand($n)), int(rand($n)), 'force.0.5.1LGY.pdb') for 1..$n; cmpthese( 10**(6-$e), { 'simple' => sub { my @unsorted = @data; my @sorted = sort { $a <=> $b } @unsorted; }, 'ST' => sub { my @unsorted = @data; my @sorted = map $_->[0], sort { $a->[1] <=> $b->[1] } map { [ $_, int $_ ] } @unsorted; }, } ); } __END__ Number of file names: 100 Rate ST simple ST 3247/s -- -75% simple 12987/s 300% -- Number of file names: 1000 Rate ST simple ST 248/s -- -79% simple 1176/s 375% -- Number of file names: 10000 Rate ST simple ST 10.3/s -- -74% simple 39.2/s 280% -- Number of file names: 100000 s/iter ST simple ST 1.87 -- -50% simple 0.943 99% -- #### 30.31.force.0.5.1LGY.pdb 30.32.force.0.5.1LGY.pdb #### use Devel::Peek; my $s = "30.31.force.0.5.1LGY.pdb"; Dump $s; print 0+$s, "\n"; # treat as number Dump $s; __END__ SV = PV(0x605150) at 0x604fa0 REFCNT = 1 FLAGS = (PADBUSY,PADMY,POK,pPOK) PV = 0x6370d0 "30.31.force.0.5.1LGY.pdb"\0 CUR = 24 LEN = 32 30.31 SV = PVNV(0x607880) at 0x604fa0 REFCNT = 1 FLAGS = (PADBUSY,PADMY,NOK,POK,pIOK,pNOK,pPOK) IV = 30 <--- NV = 30.31 <--- PV = 0x6370d0 "30.31.force.0.5.1LGY.pdb"\0 CUR = 24 LEN = 32