PCRE は possessive を使うと速いのか → 変わらない
簡単な例として /
のようなパターンがあったときに "
にマッチさせる必要がないならば /
(non-greedy) とすれば無駄なバックトラックが発生しない分相当速くなる。
これは当たり前だが、ここでさらに "
にマッチさせたくないならば /
というパターンにできる。
疑問なのは、これをさらに /
(possessive) としてバックトラックを禁止すると速くなるのかどうか。
感覚的にはマッチしなかった場合にバックトラックしない分、速くなりそうなのだが、以前Perlでpossessiveにしたところパフォーマンスが落ちたことがあったのでとりあえずドキュメントに当たってみた。
それによるとPCRE2では自動的にそのような最適化が行われるらしい。PCRE2_NO_AUTOPOSSESS
や /(*NO_AUTO_POSSESS)/
を指定しない限りは勝手にpossessiveになるそうだ。
ただPCREかPerlかBoostか忘れたが何かの正規表現エンジンで /^(?:A|B)/
を /^A|^B/
と書いたら目に見えて遅くなったことがあるので、明らかに等価でもいつも最適化されるとは限らないだろうとは思う。