2

これら 2 つのバージョンの 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
4

2 に答える 2

4

正規表現エンジンの速度低下の主な原因はバグ修正です。つまり、正しく行うことは、間違ったことを行うよりも遅くなります。

于 2013-05-29T06:03:50.647 に答える
0

私は自分のマシンであなたのプログラムを数回テストしました。各実行時間は異なり、個々の違いは、バージョン間のほとんどの違いよりも大きい場合があります。

バージョン間の違いは重要ではないと思います。ところで、比較すると次のランキングが表示されます。

遅い/遅い/速い/遅い/遅い/速い

5.16.2 と 5.8.8 の場合

実際、あなたは 100,000 回ほとんど何もしていません。試す:

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);
 }

これで、正規表現エンジンがまったく関与しているかどうか (またはすぐに終了したかどうか) を確認できます。

于 2013-05-29T16:17:07.783 に答える