【結論】p は遅くない!

先日、次のように書きました。

p{Hiragana} が PCRE と比べてものすごく遅いです。p{Lu} とかは速いのですが、どうも Unicode Script 系が軒並み遅いようです。

原因がわかりました。

遅いのは最適化がらみでした。p が遅いのではありませんでした。

検証に使っていた正規表現はこんなのです。

p{Hiragana}{10,}

なぜ、{10,} なのか?

ターゲットのテキストが日本語なので、p{Hiragana}+ だとテストにならないからです。

でもコレが問題だったのです。

実は、この正規表現は次のような最適化が可能です。

  1. 正規表現エンジンを起動する前に、p{Hiragana} がマッチする場所を検索する
  2. 見つけたら10文字先が p{Hiragana} にマッチするか調べる
  3. マッチしたら正規表現エンジンを起動する
  4. マッチしなかったら11文字目に文字位置を移動し、1に戻る。

このような正規表現はよく使われるのですが、SkRegExp はこの種の最適化は行なっていません。だから、圧倒的な差が出たというわけです。

ちなみに、ターゲットテキストを英文に変え、その末尾にひらがなを付け加え、p{Hiragana}+ を試してみました。

これは SkRegExp の方が速かったです。

と言う訳で、最優先の課題は {10,} の最適化と決まりました。

コメントを残す

メールアドレスが公開されることはありません。