ORegex:オブジェクトに対して十分に高速ですか?

画像


こんばんは、ハラジテリ! 今日は、ORegex .NETのパフォーマンス評価について少しお話したいと思います。
ここで私の以前の記事を読んだ場合、私の意見では、速度の比較評価なしで何かを想像することはあまり説得力がありませんでした、そう思いませんか? はいの場合は、猫の下であなたに。


私は長い間自分自身を苦しめないために、ベンチマークに何を含めるべきかについて長い間考えていました。 これに多くの時間/労力を費やしたくはありませんでした。SF作家と私はまったく役に立たないので、最も単純な比較を行うことにしました-テキスト内の部分文字列を見つけます。 私の意見では、パフォーマンステストでは、シンボルもオブジェクトであるため、これが最善のソリューションです。 すべてのコードがgitハブのテストプロジェクトに存在することに注意してください。何もする必要がない場合は実行できます=)


MicrosoftのORegexおよびRegexエンジンがあります。必要なのは、両側の同様のパターン、ORegexの各文字のラムダを記述することだけです。テストケースを作成することを忘れないでください。 長く考える必要はありませんでしたが、ツールが3つのタスクにどのように対応するかを確認することにしました。


  1. 現実 (htmlタグの解析、高度に構造化されたデータの実用的なチェック)
  2. ランダム (完全にランダムなデータセット内のオカレンスの検索と同様)
  3. エラー (バックトラッキングをキャンセルした人はいないため、非常に不正なデータがあるセットを確認する必要があります)

現実


ニュースサイトからページが選択され、タスクは20回の繰り返しですべてのpタグを見つけるように設定されました。 ご想像のとおり-正規表現が先です。 最初の反復での両方のツールは、コールドスタートとほぼ同じ結果を示しました。 最初の反復の後、速度の差は約10倍異なりました。


ORegexパターン:{b1o} {p} {b1c}。*?{B1o} {s}} {p} {b1c}; 正規表現パターン: <p >。*? </p >


いやオレゲックス正規表現比率
100:00:00.004020400:00:00.00585711.46
200:00:00.003094400:00:00.00031720.1
300:00:00.003209300:00:00.00031950.1
400:00:00.003104000:00:00.00031720.1
500:00:00.003235400:00:00.00031490.1
600:00:00.003170300:00:00.00031530.1
700:00:00.003122000:00:00.00031870.1
800:00:00.003088300:00:00.00031870.1
900:00:00.003679000:00:00.00036740.1
1000:00:00.003090200:00:00.00031450.1
1100:00:00.003078700:00:00.00031300.1
1200:00:00.003075200:00:00.00031490.1
1300:00:00.003097500:00:00.00031830.1
1400:00:00.003225000:00:00.00037770.12
1500:00:00.003116600:00:00.00031790.1
1600:00:00.003085200:00:00.00031410.1
1700:00:00.003117800:00:00.00031600.1
1800:00:00.003091300:00:00.00031600.1
1900:00:00.003078700:00:00.00031330.1
2000:00:00.003081800:00:00.00031180.1

ランダム


次に、データがロジックにまったく役立たない場合の違いを確認する価値があります。 テストのために、指定された文字の完全にランダムなセットでファイルが作成されました。


ORegexパターン:{a}({b} {a})+; 正規表現パターン:a(ba)+


いやオレゲックス正規表現比率
100:00:00.178587700:00:00.06221460.35
200:00:00.214105500:00:00.05787350.27
300:00:00.214845700:00:00.05390550.25
400:00:00.198478100:00:00.04992800.25
500:00:00.207345400:00:00.06346930.31
600:00:00.159264400:00:00.08428340.53
700:00:00.216780500:00:00.05277190.24
800:00:00.201231600:00:00.05112910.25
900:00:00.192855500:00:00.05049310.26
1000:00:00.188742700:00:00.05466910.29
1100:00:00.166316800:00:00.07414610.45
1200:00:00.162833500:00:00.07422500.46
1300:00:00.207762600:00:00.04819130.23
1400:00:00.170948700:00:00.05016480.29
1500:00:00.186910200:00:00.04773730.26
1600:00:00.217355500:00:00.06297280.29
1700:00:00.189719600:00:00.04955710.26
1800:00:00.193937000:00:00.04941730.25
1900:00:00.224984600:00:00.04790440.21
2000:00:00.203724200:00:00.08159320.4

この場合、RegexからのORegexの遅れはわずか約3倍です。


エラー


さて、現時点では、ORegexが高度に構造化されたデータとランダムセットの文字シーケンスを見つけることで負けていることは明らかですが、エラーのあるケースはどうでしょうか。 2つのツールがbactracking-proofである限り、テストは簡単です。 このために、特別なテンプレートが設定され、「x」の1つからの文字列サイズが150文字ずつ徐々に増加しました。その結果、3回目の反復で、Regexはほぼ30倍遅れました。


ORegexパターン:{x} + {x} + {y} +; 正規表現パターン:x + x + y +


いやオレゲックス正規表現比率
100:00:00.008214400:00:00.00942311.15
200:00:00.000504500:00:00.006440612.76
300:00:00.011438300:00:00.332233029.05

まとめ


要約すると、もちろん、このツールを使用して部分文字列を検索するのは不合理で愚かなことです。 これには、より高速な正規表現エンジンがあります。 一連のオブジェクト(遺伝子のシーケンス内のゲノム、単語内の単純なエンティティ、メモリダンプ内のオブジェクトなど)のパターンを見つけるためのタスクが迅速、簡単、かつ理解できる場合、そのような速度の違いは私の意見ではかなり受け入れられます。
以上です。 ご清聴ありがとうございました! =)



Source: https://habr.com/ru/post/J305256/


All Articles