私のコメント私は、正規表現の計算時間は、ほとんどの場合、ファイルシステムを読み取る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です。まあ...
'*'は「何もない」と一致することができます。 '.'は少なくとも1つの文字が必要です。ファイル名が "ヌル"のファイルを作るのはあまり意味がありません(おそらくファイルシステムでは合法ではありません)。 –
ほとんどの場合、あなたの時間はファイルの名前を調べるのに費やされます。 e。 I/O操作で使用します。ワイルドカードとの名前の照合は、あらゆるI/O操作と比較して事実上ゼロになるほど速くなります。したがって:いいえ、パフォーマンスの関連性の違いは期待しないでください。 – Bernhard
私は以下の私の答えで上記のコメントを構築しました。 1つは他のものより優れていますが、どちらも驚くほど速いです。 – Bernhard