結城浩のはてなブログ

ふと思いついたことをパタパタと書いてます。

regexp - possessive quantifier

regexp - possessive quantifier (独占的|絶対最大)量指定子とは何か?を読んで、greedyとpossessiveの比較用スクリプトを書いてみました。対象文字列の長さに応じて時間がかかるので、少しずつ長くしています。

use strict;
use warnings;
use Benchmark qw(:all);

my $count = 100000;

for my $len (1..100) {
    my $s = ('a' x $len);
    print "\$s = $s\n";
    cmpthese($count, {
        'greedy'     => sub { $s =~ /(a+)(a+)(a+)z/ },
        'possessive' => sub { $s =~ /(a++)(a++)(a++)z/ },
    });
    print "\n";
}

実行例です。最初の数件は数が少なくて信頼できないので割愛。

(略)

$s = aaaaaaaaaaaaaaaaaaaaa
              Rate     greedy possessive
greedy     21053/s         --       -78%
possessive 95602/s       354%         --

$s = aaaaaaaaaaaaaaaaaaaaaa
              Rate     greedy possessive
greedy     18553/s         --       -81%
possessive 98425/s       431%         --

$s = aaaaaaaaaaaaaaaaaaaaaaa
              Rate     greedy possessive
greedy     16978/s         --       -81%
possessive 91408/s       438%         --

^C(中断)