$ra cmp $rb || # this is number. Shouldn't this be <=> ?
####
#!/usr/bin/perl -wl
use strict;
use Benchmark;
use vars qw/ @data /;
use vars qw/ @results1 @results2 /;
@data = qw/
18DD13AR0B2.vec 5A344R2B15.ras 5A344R2B15.vec 5A35SR0.ras
113A28R1.vec 113A28AR0.vec 113A29R0.ras 5A32R0.ras
113A29R1.vec 18AD13XR0B3.ras 18AD13XR0B3.vec 113A22R1.ras
5A35R0.vec 5A34R0.ras 113A22R1.vec 18DD12YR0B2.vec
18DD13AR0B2.ras 113A29AR0.ras 113A29AR2.vec 113A28R0.vec
5A33R0.vec 5A34R0.vec 5A35R0.ras 113A28AR2.vec
113B28R2.ras 113A28R2.vec 13B29AR0B1.ras 113B29AR0B1.vec
5A32R0.vec 5A33R0.ras /;
timethese(5000, {
'mkmcconn' => '
@results1 = ();
for (sort{
my ($t0a,$t1a,$p0a,$pda,$ra,$alta,$la) =
map(m!(\d+)(\D+)(\d+)(\D*)R(\d+)B?(\d*)\.(\w+)$!,$a);
my ($t0b,$t1b,$p0b,$pdb,$rb,$altb,$lb) =
map(m!(\d+)(\D+)(\d+)(\D*)R(\d+)B?(\d*)\.(\w+)$!,$b);
$la cmp $lb ||
($altb eq ""? 0 :$altb) <=> ($alta eq "" ? 0 : $alta) ||
$t0a <=> $t0b ||
$t1a cmp $t1b ||
$p0a <=> $p0b ||
$ra cmp $rb ||
$pda cmp $pdb;
} @data ) {
push @main::results1, $_;
}
',
'Ovid' => '
@main::results2 = ();
@main::results2 =
map { $_->[0] }
sort
{
$a->[1][0] cmp $b->[1][0]
||
$b->[1][1] <=> $a->[1][1]
||
$a->[1][2] <=> $b->[1][2]
||
$a->[1][3] cmp $b->[1][3]
||
$a->[1][4] <=> $b->[1][4]
||
$a->[1][5] <=> $b->[1][5]
||
$a->[1][6] cmp $b->[1][6]
}
map { [$_, main::get_data( $_ )] } @main::data;
',
});
use Data::Dumper;
open T, "> test.txt" or die $!;
print T Dumper \@results1, \@results2;
close T;
sub get_data
{
local $_ = shift;
my @data = ( m!(\d+)(\D+)(\d+)(\D*)R(\d+)B?(\d*)\.(\w+)$! );
# add default, if necessary
$data[3] ||= '';
$data[4] ||= 0;
$data[5] ||= 0;
# reorder the data for sorting
@data = @data[ 6, 5, 0, 1, 2, 4, 3 ];
return \@data;
}
##
##
C:\>perl test.pl
Benchmark:
timing 5000 iterations of
mkmcconn, Ovid
...
mkmcconn: 69 wallclock secs (68.61 usr + 0.00 sys = 68.61 CPU) @ 72.88/s (n=5000)
Ovid: 32 wallclock secs (32.68 usr + 0.00 sys = 32.68 CPU) @ 153.00/s (n=5000)