my @sorted = map substr($_, 19), sort map substr($_, -(19+20), 19) . $_, @LogAnalyser::LogFileList; #### Rate memoized st naive grt memoized 12517/s -- -30% -64% -66% st 17883/s 43% -- -48% -52% naive 34555/s 176% 93% -- -6% grt 36872/s 195% 106% 7% -- #### use strict; use warnings; use Benchmark qw( cmpthese ); my %cache; sub memoized { my $left = ( $cache{$a} ||= substr($a, -(19+20), 19) ); my $right = ( $cache{$b} ||= substr($b, -(19+20), 19) ); return $left cmp $right; } @::LogFileList if 0; @::LogFileList = qw( /devLog/devid234/term_logs/devid234.2009-08-27-23-55-11.terminal.log.tar.gz /devLog/devid234/term_logs/devid234.2009-08-27-15-05-06.terminal.log.tar.gz /devLog/devid234/term_logs/devid234.2009-08-27-01-45-03.terminal.log.tar.gz /devLog/devid234/term_logs/devid234.2009-08-28-00-00-01.terminal.log.tar.gz /devLog/devid234/term_logs/devid234.2009-08-28-18-25-04.terminal.log.tar.gz /devLog/devid168/term_logs/devid168.2009-08-28-01-35-02.terminal.log.tar.gz /devLog/devid168/term_logs/devid168.2009-08-27-04-02-01.terminal.log.tar.gz /devLog/devid168/term_logs/devid168.2009-08-28-20-25-01.terminal.log.tar.gz /devLog/devid168/term_logs/devid168.2009-08-27-17-55-01.terminal.log.tar.gz /devLog/devid918/term_logs/devid918.2009-08-27-21-15-01.terminal.log.tar.gz /devLog/devid918/term_logs/devid918.2009-08-27-13-25-01.terminal.log.tar.gz /devLog/devid918/term_logs/devid918.2009-08-27-00-00-01.terminal.log.tar.gz /devLog/devid918/term_logs/devid918.2009-08-28-00-00-02.terminal.log.tar.gz /devLog/devid918/term_logs/devid918.2009-08-28-09-45-01.terminal.log.tar.gz /devLog/devid918/term_logs/devid918.2009-08-28-19-25-01.terminal.log.tar.gz /devLog/devid167/term_logs/devid167.2009-08-28-02-45-01.terminal.log.tar.gz /devLog/devid167/term_logs/devid167.2009-08-27-01-45-02.terminal.log.tar.gz /devLog/devid167/term_logs/devid167.2009-08-27-10-55-01.terminal.log.tar.gz ); cmpthese(-3, { naive => ' use strict; use warnings; my @sorted = sort { substr($a, -(19+20), 19) cmp substr($b, -(19+20), 19) } @::LogFileList; ', memoized => ' use strict; use warnings; my @sorted = sort memoized @::LogFileList; ', st => ' use strict; use warnings; my @sorted = map $_->[0], sort { $a->[1] cmp $b->[1] } map [ $_, substr($_, -(19+20), 19) ], @::LogFileList; ', grt => ' use strict; use warnings; my @sorted = map substr($_, 19), sort map substr($_, -(19+20), 19) . $_, @::LogFileList; ', });