1.前回の研究発表で作成したツールプログラムに、正規表現検索を入れていた
◯画面左上のテキストボックスに入力された文言を正規表現パターンとして検索する機能

当初は通常の検索だけを考えており、動作も重そうなので正規表現検索を実装する予定はなかった
→実際にどの位の速度で検索できるかを確認
2.実際に検索速度を比較してみる
| 検索処理のプログラム | 処理速度(*) |
|---|---|
| ①//通常の検索 return [探す対象の文字列].Contains([探したい文字列]); | 1130.5(±20.0) ms |
| ②//正規表現検索 return Regex.IsMatch([探す対象の文字列], [探したい文字列]); | 904.5(±10.4) ms |
| ③//正規表現検索(正規表現パターンをコンパイル) var regex = new Regex([探したい文字列], RegexOptions.Compiled);//この変数は使い回す ・・・ return (regex.Matches([探す対象の文字列]).Count > 0); | 377.5(±14.3) ms |
アルファベット・英数字をランダムをランダムに並べた1万文字のデータx10万件の内、
文字列「abcde」が含まれるものの件数を取得する処理。
10回試行し、その平均値を表示している。
→正規表現を使った検索処理の方が早い。③の方法で研究発表のツールを実装した.
3.なぜ通常の検索処理の方が遅いのか(予想)
- String.Containsの実装でロケールの判定が入っているため?(リファレンス実装のソースコードより)
- 正規表現の処理の実装言語が高速であるため?
参考 「Reference Source – String.IndexOf()」 https://referencesource.microsoft.com/#mscorlib/system/string.cs,ef82268cfee756fe
メモ
・.NET Framework4.8.1でビルド
・Regexクラス自体は.NET Framework1.1から存在
・String.ContainsはIndexOfに処理を移譲している


コメント