SkRegExp のボトルネック

前回、 ExecNext が遅いと書いたことに関連します。

「 ExecNext が遅い」ことに関しては環境の問題だったようです。

ただ、その時調べたことから SkRegExp のボトルネックに気が付きました。

その記事のコメントで、 benok さんに Sampling Profiler と言うソフトを教えていただきました。

それを使って調べたところ、 TREMacthEngine.MatchPrim で多くの時間を費やしていることがわかりました。

マッチエンジンの中心なので当然です。

これは AQTime でわかっていました。

Sampling Profiler でわかったのは「 MatchPrim 内のどこで時間を費やしているか?」でした。

スタートアップとクリーンアップで70%を占めていました。

アセンブラで見てみると実にたくさんの仕事をしていました。

MatchPrim は1文字ごとに最低1回は呼び出されています。

コレは重いです。

SkRegExp は PCRE に比べると単純なパターンと単純な検索文字列の組み合わせが遅いです。

今まではその種の最適化をしていないせいだと考えていました。

しかし、 MatchPrim が重いためかもしれないと考えを改めました。

単純なパターンはエンジンの素の性能を表しているのかも、ですね。

そんなわけで、 MatchPrim メソッドを MatchCore 内に展開することにしました。

が、 MatchPrim を呼び出しているメソッドは5つあります。

5つ全部に MatchPrim を展開したらメンテナンスが大変です。

コードも大きくなりますし。

前段階として、今、 MatchCore を1つにまとめる作業をしています。

これが意外に大変でして…。

次のバージョンアップは地味なものになりそうです。

コメントを残す

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