0

必ずしもLinuxではなく、IDE内のすべてのファイルを正規表現ベースのフィルタリングをサポートする巨大なコードベースと一致させるために、特定のファイルシステム内のすべてのファイルに一致するフィルターを提供する必要があるとしましょう。使用する間に大きなパフォーマンスの違いはありますか

*

対。

*。*

注: 上記の式の余分なスペースは無視してください。スペースなしで投稿すると、何らかの理由でドットになります。

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

4

2 に答える 2

0

私のコメントは、正規表現のマッチングの計算時間は、ほとんどの場合、ファイル システムを読み取る I/O よりも短いということです。これは、正規表現がどれほど高速であるかを示す例です。私はいくつかの小さなデスクトップ i5 @3.1Ghz 8MB RAM を使用しています - 数値計算機ではありませんが、悪くはありません。多くの人が同様のものを使用します。時間の測定が簡単なインタープリター言語である R を使用しています。

古い DOS 時代のように、8 文字からなる 100 万個のファイル名の無作為抽出で 3 文字を指します。コードは次のとおりです。

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 万個のファイル名すべてを grep しました。

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

すべてのファイル名を 100 回 grep したうち、最長時間は 477 ミリ秒、平均時間は 393 ミリ秒でした。ここで、ファイル システムが 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 ミリ秒かかるかは誰にもわかりません。


より現実的な 10,000 個のファイル名の場合、結果は次のようになります。

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

したがって、1 つの星は 1 ミリ秒未満で評価され、star-dot-star の Translation は 3 ミリ秒未満で評価されます。これは、単一の星の場合、3.1 倍高速です。良い...

于 2016-09-12T15:26:18.220 に答える