9

私たちはboost::regexを取り除こうとしていますが、それはひどいパフォーマンスです。このベンチマークによると、鬼車は全体的に最高です。

中程度(100文字)から巨大(1k文字)までの文字列に適用する複数の正規表現(および常に変化する)があります...したがって、非常に異質な環境です。

成功した人はいますか?PCREやRE2のようなより「標準的な」ものを選ぶことをお勧めしますか?

ありがとう !

4

2 に答える 2

9

2種類の実装(FSAとBT)の動作はまったく異なり、右側の列(電子メール)で確認できます。

鬼車は一般的に高速ですが、特定の正規表現で「運が悪い」場合は、実行が遅くなる可能性があります。これは、バックトラッキングアルゴリズムであるためです。

対照的に、re2は一般的に少し遅いですが、同じリスクはありません。その時間は同じように爆発することはありません[*](最悪の場合の指数関数的な動作はありません)。

だからそれは細部に依存します。正規表現が安全であると確信している場合、または遅い一致を検出して中止する意思がある場合は、鬼車が理にかなっています。しかし、個人的には、re2のセキュリティのためにもう少し(それほど多くはない)支払う傾向があります。

詳細については、 http: //swtch.com/~rsc/regexp/regexp1.html(re2作成者による)を参照してください。

[*]ええと、多分決して強すぎることはありません。一部の正規表現では、特定のケースではBTアプローチにフォールバックする必要があると思います(以前の一致と先読みの一致が含まれる可能性があります)。ただし、ほとんどの正規表現ではさらに安全です。

于 2012-08-16T23:53:14.357 に答える
6

私は次の書店でベンチマークを行いました。

  • ブースト
  • re2
  • 鬼車

ベンチマークは、非常に異種の正規表現(グループ化、グループ化ではない、長いもの(484文字)、短いもの、パイプ、\ ?、 *、など)で正規表現を多用する一連のテストを実行することで構成されました。数文字から約8k文字のテキストに適用されます。

正規表現の一致が計算されるたびに、正規表現を保存し、ミリ秒カウンターをインクリメントして、正規表現の計算に費やされた時間を累積しました(複数回呼び出されます)。

各ライブラリのすべての正規表現に費やされた合計時間は次のとおりです。

  • ブースト:98840ミリ秒
  • re2:51197ミリ秒
  • 鬼車:16095ms
  • re2(CAPUTREなし*以下を参照)):16162ミリ秒

*私たちは(ほとんど)常に正規表現でグループのコンテンツをキャプチャしたいと考えており、re2はグループをキャプチャするとひどいパフォーマンスを示しますここを参照)。上記の結果では、グループをキャプチャできない場合にパフォーマンスが向上するため、それほど多くは表示されません。たとえば、この正規表現(何度も実行されます)では:

^((?:https?://)?(?:[a-z0-9\-]{1,63}\.)+(?:[a-z0-9\-]{1,63}))(?:[^\?]*).*$

各ライブラリの結果は次のとおりです。

  • ブースト:140ミリ秒
  • re2:5663ミリ秒
  • 鬼車:53ms
  • re2(キャプチャなし):37ミリ秒。

5663ミリ秒から37ミリ秒へのre2の低下を参照してください。

tl; dr

ですから、私たちの使用では、鬼車が明らかに優れているという結論に達しました。

ただし、グループをキャプチャする必要がない場合は、APIの方が使いやすいことがわかったため、re2の方が適しています。

于 2012-08-22T12:36:17.497 に答える