LINUX.ORG.RU

История изменений

Исправление 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.