1

次の正規表現を最適化して最高のパフォーマンスを得るのを手伝ってください。いくつかの記事を読みましたが、この問題はすぐに解決して CPU 使用率と遅延時間を減らす必要があるため、 try と false を実行する時間がありません。

たとえば、最初のものは一致する必要があります

http://microsoft.com/test/temp.iso

http://download.microsoft.com/TEMP.iso

:

  • すべての URL は で始まる必要があるため、最初http:// に配置する方がよいかどうかわかりません。^http://

  • 最初の行と最後の行には特定のルールがありますが、それらの間の行は組み合わせることができます。

どんな助けでも大歓迎です。

refresh_pattern -i (.+\.||)(microsoft|windowsupdate).com/.*\.(cab|exe|dll|ms[i|u|f]|asf|wm[v|a]|dat|zip|iso|psf) 
refresh_pattern -i (.+\.||)eset.com/.*\.(cab|exe|dll|ms[i|u|f]|asf|wm[v|a]|dat|zip|ver|nup) 
refresh_pattern -i (.+\.||)avg.com/.*\.(cab|exe|dll|ms[i|u|f]|asf|wm[v|a]|dat|zip|ctf|bin|gz) 
refresh_pattern -i (.+\.||)grisoft.(com|cz)/.*\.(cab|exe|dll|ms[i|u|f]|asf|wm[v|a]|dat|zip|ctf|bin|gz) 
refresh_pattern -i (.+\.||)avast.com/.*\.(cab|exe|dll|ms[i|u|f]|asf|wm[v|a]|dat|zip|vpx|vpu|vpa|vpaa|def|stamp) 
refresh_pattern -i (.+\.||)(kaspersky-labs|kaspersky).com/.*\.(cab|zip|exe|msi|msp|bz2|avc|kdc|klz|dif|dat|kdz|kdl|kfb) 
refresh_pattern -i (.+\.||)nai.com/.*\.(gem|zip|mcs|tar|exe|) 
refresh_pattern -i (.+\.||)adobe.com/.*\.(cab|aup|exe|msi|upd|msp) 
refresh_pattern -i (.+\.||)symantecliveupdate.com/.*\.(zip|exe|msi) 
refresh_pattern -i (.+\.||)(192\.168\.10\.34|mywebsite.com)/.* 

編集: これらの正規表現はsquid 構成で使用されます

4

2 に答える 2

4

正規表現を最適化するためのヒント:

まず、 を使用する.*と、照合する文字列のサイズと、文字列内で一致が通常どれだけ早く終了するかによって、パフォーマンスの問題が発生する可能性があります。試してみて.*?、それが役立つかどうかを確認してください。が一致する性質の詳細を知っていれば、.より迅速な代替品を見つけることができるかもしれません。

次に、正規表現エンジンがサポートしていて、実際に一致からキャプチャ グループを抽出する必要がない場合は、それらを非キャプチャにすることができます。これにより、わずかではありますが一貫してパフォーマンスが向上します。Ruby では、非キャプチャ グループは次のようになります(?:PUT CONTENTS HERE)

アドバイスの 1 つ: あなたは「この問題を早く解決したい」と言っていますが、試行錯誤する「時間がない」と言っています。申し訳ありませんが、最高のパフォーマンスが必要な場合は、独自のベンチマークを行い、言語とデータ セットで最速のものを見つける必要があります。私のような人にできることは、代替ソリューションのベンチマークを行う際に、何を試してみるべきかをいくつか提案することだけです。

于 2013-10-26T16:01:58.033 に答える
0

プログラミング言語によっては、プログラムの開始時にこの正規表現をコンパイルしてから、正規表現オブジェクトを再利用することができます。C# では次のようになります。

Regex regex = new Regex(pattern, RegexOptions.Compiled);

正規表現のコンパイルにはもう少し時間がかかりますが、数回使用すればそれだけの価値があります。

于 2013-10-26T15:47:46.937 に答える