朝会発表テーマ

C#での正規表現速度比較

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に処理を移譲している

コメント