再び SkRegExp と TPerRegEx

SkRegExp と TPerlRegEx を、最適化による差が出にくいパターンとテキストで比較すると SkRegExp の方が速いです。

つまり、マッチエンジン自体の性能は SkRegExp の方が良いと言うことですよね。

逆に言うと、現状では最適化に差があるとも言えるわけです。

たとえば、”a*b” というパターンを “ccccc…aaa…b” と言うターゲット文字列にマッチさせたとします。

SkRegExp version 1.1.x の最適化は、必須文字 “b” がターゲット文字列にあるかをチェックします。

あるとわかったら、文字列の先頭からエンジンを適応していきます。

一方、TPerlRegEx で study をかけると、上記の最適化までは同じですが、同時に、先頭文字が [ab] かのチェックも行います。

つまり、[ab] 以外の文字列ならエンジンを起動しないわけです。

当然、SkRegExp より study をかけたPerlRegExp の方が速くなります。

ちなみに5回比較した結果が以下。

SkRegExp Ave Time: 500 : (Matched)
TPerlRegEx Ave Time: 515 : (Matched)
SkRegExp Ave Time: 547 : (Matched)
TPerlRegEx Ave Time: 516 : (Matched)
SkRegExp Ave Time: 547 : (Matched)
TPerlRegEx Ave Time: 547 : (Matched)
SkRegExp Ave Time: 546 : (Matched)
TPerlRegEx Ave Time: 531 : (Matched)
SkRegExp Ave Time: 484 : (Matched)
TPerlRegEx Ave Time: 516 : (Matched)

いい勝負じゃないかと思う人は次を見てください。

SkRegExp Ave Time: 390 : (Matched)
TPerlRegEx Ave Time: 531 : (Matched)
SkRegExp Ave Time: 390 : (Matched)
TPerlRegEx Ave Time: 515 : (Matched)
SkRegExp Ave Time: 391 : (Matched)
TPerlRegEx Ave Time: 531 : (Matched)
SkRegExp Ave Time: 390 : (Matched)
TPerlRegEx Ave Time: 531 : (Matched)
SkRegExp Ave Time: 391 : (Matched)
TPerlRegEx Ave Time: 516 : (Matched)

これは同じターゲット文字列に、”a+b” をマッチさせた結果です。

“a+b” だと、SkRegExp も TPerlRegEx と同じ先頭文字チェックを行います。その結果がこれです。

正規表現エンジンにおける最適化とは、如何に正規表現エンジンを起動しないかに尽きるんですが、SkRegExp はその辺りがまだまだ足りないんですね。

今後は、version 1.1.x をベースに、地味なのでモチベーションが上がらなかった最適化に、真面目に取り組んでいきます。

コメントを残す

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