3

データのブロックに対して一連の正規表現を実行しています。私たちは最近、Activestate perl 5.8 32 ビット (知っています... 非常に古いものです!) から perl 5.16 64 ビットにアップグレードしました。すべてのハードウェアは同じままでした (Windows)。

以前は解析ループに約 2.5 秒かかっていましたが、現在は約 5 秒かかります。何が変化を引き起こすかについて、誰かが私にヒントを与えることができますか? エンジンが大幅に改善されたことを理解していたので、パフォーマンスの向上を期待していました。私が何をすべきかについてのドキュメントは大歓迎です。

4

2 に答える 2

7

はい、正規表現エンジンは v8 以降大幅に改善されました。v10 だけで、次のことがわかりました。

  • パターン再帰
  • 名前付きキャプチャ
  • 所有量指定子
  • (*FAIL)またはのようなバックトラック制御動詞(*SKIP)
  • \Kオペレーター_
  • …その他

また、より多くの内部が Unicode 対応になりました。

v12 では、Unicode サポートがクリーンアップされました。正規表現の\pand\X演算子が大幅に強化されました。

v14 では、Unicode サポートが 6.0 に引き上げられました。オペレーターの文字\N名が改善されました (charnamesプラグマも参照)。新しい文字モデルは、任意の符号なし整数をコードポイントとして扱うことができます。正規表現エンジンでは、

  • /u正規表現は、/d/l、 、/aなどのcharclass 修飾子を保持できるようになり/aaました。
  • との非破壊置換/rが実装されました。
  • RE エンジンは再入可能になったため、組み込みコードで正規表現を使用できます。
  • \pクリーンアップされました
  • Unicode セマンティクスへの切り替えが必要な場合は、正規表現のコンパイルが高速になります。

v16 では、perl は Unicode 6.1 をほぼサポートしています。正規表現エンジンでは、

  • 文字クラスの効率\pが向上しました。
  • さまざまな正規表現のバグ (多くの場合、大文字と小文字を区別しない一致を含む) が修正されました。

明らかに、これらの機能のすべてに代償が伴うわけではありませんが、特に Unicode 対応は内部をより複雑にし、遅くします。

また、手を放棄して、スクリプトの実行時間が perl5 v8 x86 から perl5 v16 x64 に倍増したと述べることもできません。変数が多すぎます:

  • 両方の Perl は同じフラグでコンパイルされましたか?
    • どちらも perl スレッド化された perl です (スレッド化サポートを無効にすると高速になります)
    • あなたの整数の大きさは?64ビットか32ビットか?
    • どのコンパイラの最適化が選択されましたか?
  • 以前の Perl にはディストリビューション固有のパッチが適用されていましたか?

基本的に、出力全体を比較する必要がありperl -Vます。


正規表現でパフォーマンスの上限に達している場合、それらは広範な解析には不適切なツールである可能性があります。少なくとも、新しい機能を使用して正規表現を最適化し、バックトラッキングを排除することができます。

(?{...})構文解析コードが (大まかに) 文脈自由言語 (つまり、(?=...)や関連する正規表現機能を使用しない) を記述し、構文解析がツリーの生成などを意味する場合、 Marpa::R2は処理をかなり高速化する可能性があります。

于 2013-07-23T10:56:00.407 に答える