чаму ў Perl 5.16.2 regcomp павольней, чым Perl 5.8.8?

Запуск наступнага сцэнара на гэтых два версіях Perl (5.8.8 і 5.16.2) паказвае, што 5.16.2 павольней, чым 5.8.8 з рэгулярнымі выразамі-аперацыямі. Чаму гэта так? І ці ёсць спосаб я магу паскорыць працэс?

    use Time::HiRes 'time';

    for my $regex (
            q{^a$|^b$},
            q{^(a|b)$},
            q{(a|b)},
            q{^a$|^b$|^c$|^d$|^e$|^f$},
            q{^(a|b|c|d|e|f)$},
            q{a|b|c|d|e|f},
    ) {
            my $start = time();

            for my $i (1 .. 100_000) {
                    'SOMEBIGSTRINGHERE' =~ m{$regex};
            }

            my $runtime = time() - $start;
            printf("%50s: %f\n", $regex, $runtime);
    }

з Perl 5.8.8 -

                  ^a$|^b$: 0.101017
                  ^(a|b)$: 0.017527
                    (a|b): 0.107669
  ^a$|^b$|^c$|^d$|^e$|^f$: 0.163687
          ^(a|b|c|d|e|f)$: 0.022244
              a|b|c|d|e|f: 0.171675

з Perl 5.16.2 -

                   ^a$|^b$: 0.254984
                   ^(a|b)$: 0.031507
                     (a|b): 0.045713
   ^a$|^b$|^c$|^d$|^e$|^f$: 0.443303
           ^(a|b|c|d|e|f)$: 0.031506
               a|b|c|d|e|f: 0.043478
2
Што «гэта» у «Яно не»?
дададзена аўтар innaM, крыніца
Што «гэта» у «Яно не»?
дададзена аўтар innaM, крыніца
Што «гэта» у «Яно не»?
дададзена аўтар innaM, крыніца
і codepad.org/meht2abX - codepad працуе PERL v5.8.0 і ideone працуе 5.16.2
дададзена аўтар trinity, крыніца
змена в {} для дг {} і {$ м рэгулярны выраз} да $ рэгулярных выразаў палепшанага выканання ў v5.8.8, а не ў v5.16.2
дададзена аўтар trinity, крыніца
змена в {} для дг {} і {$ м рэгулярны выраз} да $ рэгулярных выразаў палепшанага выканання ў v5.8.8, а не ў v5.16.2
дададзена аўтар trinity, крыніца
змена в {} для дг {} і {$ м рэгулярны выраз} да $ рэгулярных выразаў палепшанага выканання ў v5.8.8, а не ў v5.16.2
дададзена аўтар trinity, крыніца
і codepad.org/meht2abX - codepad працуе PERL v5.8.0 і ideone працуе 5.16.2
дададзена аўтар trinity, крыніца
і codepad.org/meht2abX - codepad працуе PERL v5.8.0 і ideone працуе 5.16.2
дададзена аўтар trinity, крыніца
Яно не ў 5.16.2, але зрабіў у 5.8.8. Праверце гэта perldoc.perl.org/perlop.html#Regexp-Quote- як-аператары і ideone.com/P1m7Gl . Ці ёсць Perl 5.16.2 ня прадкампіляванага?
дададзена аўтар trinity, крыніца
Яно не ў 5.16.2, але зрабіў у 5.8.8. Праверце гэта perldoc.perl.org/perlop.html#Regexp-Quote- як-аператары і ideone.com/P1m7Gl . Ці ёсць Perl 5.16.2 ня прадкампіляванага?
дададзена аўтар trinity, крыніца
Яно не ў 5.16.2, але зрабіў у 5.8.8. Праверце гэта perldoc.perl.org/perlop.html#Regexp-Quote- як-аператары і ideone.com/P1m7Gl . Ці ёсць Perl 5.16.2 ня прадкампіляванага?
дададзена аўтар trinity, крыніца
«Ве абнавіў пытанне з розніцы ў часе паміж двума PERL версіямі. Надзея, што дапамагае.
дададзена аўтар trinity, крыніца
«Ве абнавіў пытанне з розніцы ў часе паміж двума PERL версіямі. Надзея, што дапамагае.
дададзена аўтар trinity, крыніца
«Ве абнавіў пытанне з розніцы ў часе паміж двума PERL версіямі. Надзея, што дапамагае.
дададзена аўтар trinity, крыніца
Якая розніца ў хуткасці мы гаворым?
дададзена аўтар AbsoluteƵERØ, крыніца
Якая розніца ў хуткасці мы гаворым?
дададзена аўтар AbsoluteƵERØ, крыніца
Калі змяніць д {} у ор {} і т {$ рэгулярны выраз} у $ рэгулярны выраз ён робіць розніца? (Прынамсі, у версіі (ы), якія падтрымліваюць яго.)
дададзена аўтар Qtax, крыніца
Калі змяніць д {} у ор {} і т {$ рэгулярны выраз} у $ рэгулярны выраз ён робіць розніца? (Прынамсі, у версіі (ы), якія падтрымліваюць яго.)
дададзена аўтар Qtax, крыніца
Калі змяніць д {} у ор {} і т {$ рэгулярны выраз} у $ рэгулярны выраз ён робіць розніца? (Прынамсі, у версіі (ы), якія падтрымліваюць яго.)
дададзена аўтар Qtax, крыніца

6 адказы

Асноўная прычына запаволення ў рэгулярных выразах з'яўляецца выпраўленнем памылак. г.зн. Паступаць правільна працуе павольней, чым рабіць іх няправільна.

4
дададзена
Адзін з вас, хлопцы, можаце просеять праз спіс Пераменаў і паспрабаваць знайсці адпаведная адна.
дададзена аўтар innaM, крыніца
Якія памылкі? Гучыць цікава. Любая інфармацыя на гэты конт? Unicode/UTF8 звязаныя? (У гэтым выпадку будзе сцягі як розніца?)
дададзена аўтар Qtax, крыніца

Асноўная прычына запаволення ў рэгулярных выразах з'яўляецца выпраўленнем памылак. г.зн. Паступаць правільна працуе павольней, чым рабіць іх няправільна.

4
дададзена
Адзін з вас, хлопцы, можаце просеять праз спіс Пераменаў і паспрабаваць знайсці адпаведная адна.
дададзена аўтар innaM, крыніца
Якія памылкі? Гучыць цікава. Любая інфармацыя на гэты конт? Unicode/UTF8 звязаныя? (У гэтым выпадку будзе сцягі як розніца?)
дададзена аўтар Qtax, крыніца

Асноўная прычына запаволення ў рэгулярных выразах з'яўляецца выпраўленнем памылак. г.зн. Паступаць правільна працуе павольней, чым рабіць іх няправільна.

4
дададзена
Адзін з вас, хлопцы, можаце просеять праз спіс Пераменаў і паспрабаваць знайсці адпаведная адна.
дададзена аўтар innaM, крыніца
Якія памылкі? Гучыць цікава. Любая інфармацыя на гэты конт? Unicode/UTF8 звязаныя? (У гэтым выпадку будзе сцягі як розніца?)
дададзена аўтар Qtax, крыніца

Я праверыць вашу праграму некалькі разоў на маёй машыне. Кожны запуск атрымаў розны час, індывідуальныя адрозненні, якія з'яўляюцца часам больш, чым большасць вашых адрозненняў паміж версіямі.

Я б назваў змены паміж версіямі нязначнымі. Дарэчы, ваша параўнанне паказвае наступны рэйтынг:

slower/slower/faster/slower/slower/faster

для 5.16.2 супраць прагнозу 5.8.8

На самай справе, вы робіце 100000 раз амаль нічога. спроба:

use strict;
use warnings;
use Time::HiRes 'time';
my $str = 'SOMEBIGSTRINGHERE_ somebigstringhere ' x 10000;
for my $regex ( qr{^a$|^b$},
                qr{^(a|b)$},
                qr{(a|b)},
                qr{^a$|^b$|^c$|^d$|^e$|^f$},
                qr{^(a|b|c|d|e|f)$},
                qr{a|b|c|d|e|f} ) {
     my $start = time();
     for my $i (1 .. 100) {
        $str =~ /$regex/;
     }

     my $runtime = time() - $start;
     printf("%50s: %f\n", $regex, $runtime);
 }

Цяпер вы можаце ўбачыць, ці ідзе гаворка рухавічок рэгулярных выразаў на ўсіх (або злева адразу).

0
дададзена

Я праверыць вашу праграму некалькі разоў на маёй машыне. Кожны запуск атрымаў розны час, індывідуальныя адрозненні, якія з'яўляюцца часам больш, чым большасць вашых адрозненняў паміж версіямі.

Я б назваў змены паміж версіямі нязначнымі. Дарэчы, ваша параўнанне паказвае наступны рэйтынг:

slower/slower/faster/slower/slower/faster

для 5.16.2 супраць прагнозу 5.8.8

На самай справе, вы робіце 100000 раз амаль нічога. спроба:

use strict;
use warnings;
use Time::HiRes 'time';
my $str = 'SOMEBIGSTRINGHERE_ somebigstringhere ' x 10000;
for my $regex ( qr{^a$|^b$},
                qr{^(a|b)$},
                qr{(a|b)},
                qr{^a$|^b$|^c$|^d$|^e$|^f$},
                qr{^(a|b|c|d|e|f)$},
                qr{a|b|c|d|e|f} ) {
     my $start = time();
     for my $i (1 .. 100) {
        $str =~ /$regex/;
     }

     my $runtime = time() - $start;
     printf("%50s: %f\n", $regex, $runtime);
 }

Цяпер вы можаце ўбачыць, ці ідзе гаворка рухавічок рэгулярных выразаў на ўсіх (або злева адразу).

0
дададзена

Я праверыць вашу праграму некалькі разоў на маёй машыне. Кожны запуск атрымаў розны час, індывідуальныя адрозненні, якія з'яўляюцца часам больш, чым большасць вашых адрозненняў паміж версіямі.

Я б назваў змены паміж версіямі нязначнымі. Дарэчы, ваша параўнанне паказвае наступны рэйтынг:

slower/slower/faster/slower/slower/faster

для 5.16.2 супраць прагнозу 5.8.8

На самай справе, вы робіце 100000 раз амаль нічога. спроба:

use strict;
use warnings;
use Time::HiRes 'time';
my $str = 'SOMEBIGSTRINGHERE_ somebigstringhere ' x 10000;
for my $regex ( qr{^a$|^b$},
                qr{^(a|b)$},
                qr{(a|b)},
                qr{^a$|^b$|^c$|^d$|^e$|^f$},
                qr{^(a|b|c|d|e|f)$},
                qr{a|b|c|d|e|f} ) {
     my $start = time();
     for my $i (1 .. 100) {
        $str =~ /$regex/;
     }

     my $runtime = time() - $start;
     printf("%50s: %f\n", $regex, $runtime);
 }

Цяпер вы можаце ўбачыць, ці ідзе гаворка рухавічок рэгулярных выразаў на ўсіх (або злева адразу).

0
дададзена