[Moscow.pm] Не думал что регулярные выражения настолько быстры (или substr такой медленный...)

Ruslan Zakirov ruslan.zakirov на gmail.com
Ср Дек 24 10:20:08 PST 2008


Нужно просто понимать где второй вариант тратит время:

my $vs = {
    regex => sub {
        if ( $phone =~ /^7/ ) { }
    },
    substr => sub {
        if ( substr($phone, 0, 1) eq '7' ) { }
    },
    rindex => sub {
        if ( rindex($phone, '7', 0) == 0 ) { }
    },
};

            Rate  regex rindex substr
regex  1805233/s     --   -39%   -40%
rindex 2964852/s    64%     --    -1%
substr 2991476/s    66%     1%     --

rindex привиден для более общего случая функции is_prefix($string,
$prefix), где нужно еще считать длинну префикса при использовании
substr.


2008/12/24 Denis Evdokimov <evdokimov.denis на gmail.com>:
> Мне всегда казалось, что регулярки - удобный, но не быстрый инструмент.
> И когда я написал в коде
> if ( $phone =~ /^7/ )
> Мне в голову пришла мысль, а не будет ли гораздо ли быстрее
> if ( substr( $phone, 0, 1 ) == 7 )
> глянув на эту строчку я немного поморщился из-за потери читабельности, что и
> побудило меня провести  тест "Сколько мне стоит читабельность кода"
> Результаты теста меня просто шокировали.
> Собственно своим хорошим настроением я и делюсь.
>
>
> use strict;
> use warnings;
> use Benchmark qw(:all);
>
> my $phone = '70123456789';
> my $vs = {
>     regex => sub {
>         if ( $phone =~ /^7/ ) { }
>     },
>     substr => sub {
>         if ( substr( $phone, 0, 1 ) == 7 ) { }
>     },
>
> };
> cmpthese - 5, $vs;
>
> __END__
>
>             Rate substr  regex
> substr 3867126/s     --   -21%
> regex  4887480/s    26%     --
>
>
> --
> Moscow.pm mailing list
> moscow-pm на pm.org | http://moscow.pm.org
>
>



-- 
Best regards, Ruslan.


Подробная информация о списке рассылки Moscow-pm