Использование Преобразование Шварца :
my @raw_stack = (
'900244~dfasdf~ddd3',
'900122~dfasdf~ddd1',
'900244~dfasdf~ddd2',
'900456~dfasdf~ddd4',
'900312~dfasdf~ddd3',
'900456~dfasdf~ddd5',
);
my @sorted =
map { $_->[0] }
sort { $a->[1] <=> $b->[1] }
map { [$_, (split/~/)[0]] } @raw_stack;
dump@sorted;
Benchmark:
#!/usr/bin/perl
use 5.010;
use strict;
use warnings;
use Benchmark qw(:all);
my $s = '~dfasdf~ddd3';
my @arr = ();
for(0..20000) {
push @arr, int(rand(100000)) . $s;
}
my $count = -3;
cmpthese($count, {
'ST' => sub {
my @sorted =
map { $_->[0] }
sort { $a->[1] <=> $b->[1] }
map { [$_, (split/~/)[0]] } @arr;
},
'SORT' => sub {
my @sorted =
sort {
my ($a_0) = split /~/, $a;
my ($b_0) = split /~/, $b;
$a_0 <=> $b_0
} @arr;
},
});
результат:
массив из 200 элементов:
Rate SORT ST
SORT 267/s -- -61%
ST 689/s 158% --
массив из 2000 элементов:
Rate SORT ST
SORT 18.0/s -- -71%
ST 61.5/s 242% --
массив из 20000 элементов:
Rate SORT ST
SORT 1.35/s -- -73%
ST 4.96/s 266% --