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(中断)