2016-09-12 7 views
0

与えられたファイルシステム内のすべてのファイルを一致させるために、linuxではなく、IDE内のすべてのファイルを一致させるフィルタを提供する必要があるとします。正規表現ベースのフィルタリングをサポートする巨大なコードベース。すべてのファイルを照合するフィルタ式のパフォーマンス:*対*。*

*

*を使用しての間に重大なパフォーマンスの違いがあります。 *

注:上記の余白は無視してください。何らかの理由でスペースを入れずに投稿してください。

すべてのファイルに拡張子が付いていると仮定すると、これらの式は1つで同じです。しかし、一致するファイルが膨大な場合には、他のファイルよりも優れているファイルがあるかどうかを知りたいと思います。

+0

'*'は「何もない」と一致することができます。 '.'は少なくとも1つの文字が必要です。ファイル名が "ヌル"のファイルを作るのはあまり意味がありません(おそらくファイルシステムでは合法ではありません)。 –

+0

ほとんどの場合、あなたの時間はファイルの名前を調べるのに費やされます。 e。 I/O操作で使用します。ワイルドカードとの名前の照合は、あらゆるI/O操作と比較して事実上ゼロになるほど速くなります。したがって:いいえ、パフォーマンスの関連性の違いは期待しないでください。 – Bernhard

+0

私は以下の私の答えで上記のコメントを構築しました。 1つは他のものより優れていますが、どちらも驚くほど速いです。 – Bernhard

答えて

1

パフォーマンスは正規表現エンジンごとに異なるため、実際にはわからないことがあります。 Bernhard shows in his answerのように、I/Oはどちらの正規表現よりも高価です。

あなたが本当に使用する正規表現は、しかし、これらのようになります。

.*から0個以上の文字と任意の文字列にマッチします。

.*\..*は - 0個以上の文字を含む文字列が続く期間が続く0以上の文字を含む文字列を、一致します。

これをファイルエクスプローラ/ブラウザとIDEの正規表現に対応する検索バーに入力するだけの場合は、.*を使用してください。コメントでマークBが指摘したように、よりシンプルなものを選ぶべきです。それ以外の理由がない場合は、理解しやすくなります。もし私が2番目のものを見つけたら...元の意図が何であるか疑問に思います。 .*もまた特別なもので、使用している正規表現エンジンが最適化している可能性があります。

ただし、コマンドラインでこれらの正規表現を使用することを考えている場合、またはプログラムによってプログラムを作成する場合は注意してください。あなたがやっていることに応じて、無限ループにつながる可能性 -

  • .ディレクトリ:.*は、LinuxおよびMac OS Xに悪いかもしれないいくつかのことを一致します。

  • ..ディレクトリ - 実行中のファイルは/になります。再帰オプション/フラグと組み合わせると、実行しているものがファイルシステム全体に触れることになります。

  • 隠しファイル - 隠しファイルが.

で始まり、それはほんの始まりです。 非常に文字列の幅の広いネットをキャプチャする正規表現を使用するときは注意してください。しかし、私が言ったように、検索バーであなたは.*でうまくいくはずです。

0

私のコメント私は、正規表現の計算時間は、ほとんどの場合、ファイルシステムを読み取るI/Oよりも低くなると主張しています。ここでは正規表現がどのくらい速くできるかを見てみましょう。私はいくつかの小さなデスクトップi5 @ 3.1Ghz 8MBのRAMを使用しています - 数値cruncherコンピュータではなく、悪くはない。多くの人が同様のものを使用します。私は、測定時間が簡単な通訳言語Rを使用しています。

古いDOS時間のように8文字のポイント3文字からなる100万のファイル名のランダムサンプル。 「* *」

n <- 1000000 
#simulate n filenames of 8 letters dot 3 letters 
filenames <- replicate(n, paste0(paste0(sample(LETTERS, 8),collapse=""), 
     ".", paste0(sample(LETTERS, 3), collapse=""), collapse="")) 

は私から自動翻訳を使用し、次の正規表現与えた:コードがさらに最適化することなく

> glob2rx("*.*") 
[1] "^.*\\." 

を、私は時間を割いている間、すべての100万ファイル名をgrepped:

library(microbenchmark) 
microbenchmark(
    search = grep("^.*\\.",filenames ,value=TRUE)) 

そして、これが結果です:

Unit: milliseconds 
    expr  min  lq  mean median  uq  max neval 
search 368.1657 373.883 392.9093 376.7103 415.4723 477.3519 100 

すべてのファイル名をグリッピングしている最長時間が477 MSで平均時間が393 msでした。ファイルシステムが100万のファイル名を読み取るのにどれくらいの時間がかかるか想像してください。そして、これらのファイル名のコピーを正規表現で制御するためには、インタープリター言語では0.4秒もかかりません。

"*"の自動翻訳は "^"でした。今、これはかなり高速でした:

Unit: milliseconds 
    expr  min  lq  mean median  uq  max neval 
search 166.866 167.8187 181.0547 169.0102 171.7741 236.9923 100 

2.2倍速くなりました。しかし、ファイルIOとGUIがそれらのデータ量を処理するのを待っているときに、そのようなタスクが180ミリ秒か400ミリ秒かかるかどうか、誰が気にします。より現実的な万個のファイル名については


、結果は

Unit: milliseconds 
     expr  min  lq  mean median  uq  max neval 
     star 0.840248 0.844221 0.8615701 0.847531 0.867064 1.383529 1000 
stardotstar 2.702499 2.709452 2.7827241 2.751498 2.787914 12.248153 1000 

だから、シングルスターは、ミリ秒の下で評価されており、スター・ドット・スターの翻訳は、以下の3ミリ秒単位で評価され、 。それは、単一の星のためのより速い要因3.1です。まあ...

関連する問題