История изменений
Исправление outtaspace, (текущая версия) :
Первое.
#!/usr/bin/env perl
use strict;
use warnings FATAL => 'all';
use Benchmark qw(:all);
use List::Util qw(none);
my $categories = [0 .. 100];
my $regexp = qr{^(?:STR_PISTOLS|STR_RIFLES|STR_LAUNCHERS)$}x;
my $categories_hashref = {
STR_PISTOLS => 1,
STR_RIFLES => 1,
STR_LAUNCHERS => 1,
};
cmpthese(1_000_000, {
hash => sub {
none { exists $categories_hashref->{$_} } @{ $categories };
},
regex => sub {
none { $_ =~ $regexp } @{ $categories };
},
inline => sub {
none {
$_ eq 'STR_PISTOLS' or
$_ eq 'STR_RIFLES' or
$_ eq 'STR_LAUNCHERS'
} @{ $categories };
},
});
Проще всего с хешами, наглядно (важно правильно назвать переменную) и быстро.
Rate regex inline hash
regex 46104/s -- -62% -74%
inline 120048/s 160% -- -33%
hash 179856/s 290% 50% --
Второе. Можно спрятать none в чистую функцию и сделать мемоизацию. Тоже наглядно и быстро.
Третье. Представить $categories как хэш, чтобы уйти от any.
Исходная версия outtaspace, :
Первое.
#!/usr/bin/env perl
use strict;
use warnings FATAL => 'all';
use Benchmark qw(:all);
use List::Util qw(any none);
my $categories = [0 .. 100];
my $regexp = qr{^(?:STR_PISTOLS|STR_RIFLES|STR_LAUNCHERS)$}x;
my $categories_hashref = {
STR_PISTOLS => 1,
STR_RIFLES => 1,
STR_LAUNCHERS => 1,
};
cmpthese(1_000_000, {
hash => sub {
none { exists $categories_hashref->{$_} } @{ $categories };
},
regex => sub {
none { $_ =~ $regexp } @{ $categories };
},
inline => sub {
none {
$_ eq 'STR_PISTOLS' or
$_ eq 'STR_RIFLES' or
$_ eq 'STR_LAUNCHERS'
} @{ $categories };
},
});
Проще всего с хешами, наглядно (важно правильно назвать переменную) и быстро.
Rate regex inline hash
regex 46104/s -- -62% -74%
inline 120048/s 160% -- -33%
hash 179856/s 290% 50% --
Второе. Можно спрятать none в чистую функцию и сделать мемоизацию. Тоже наглядно и быстро.
Третье. Представить $categories как хэш, чтобы уйти от any.