私のコメントは、正規表現のマッチングの計算時間は、ほとんどの場合、ファイル システムを読み取る 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 倍高速です。良い...