0

假设我需要提供一个过滤器来匹配给定文件系统中的所有文件,不一定是在 linux 中,但也用于匹配 IDE 中的所有文件,以及支持基于正则表达式的过滤的庞大代码库。使用之间是否有任何显着的性能差异

*

对比

*。*

注意:请忽略上面表达式中多余的空格,不带空格的发布由于某种原因会变成一个点。

假设所有文件都有扩展名,这些表达式是相同的。但是,我想知道其中任何一个是否优于另一个,尤其是当有大量文件要匹配时。

4

2 回答 2

1

性能会因一个正则表达式引擎而异,所以我们不能确定。正如 Bernhard在他的回答中显示的那样,I/O 比任何一个正则表达式都贵。

但是,您真正使用的正则表达式将是这些:

.*- 匹配任何包含 0 个或更多字符的字符串。

.*\..*- 匹配一个包含 0 个或多个字符的字符串,后跟一个句点,然后是一个包含 0 个或多个字符的字符串。

如果您要做的只是将其放在文件资源管理器/浏览器和 IDE 中符合正则表达式的搜索栏中,那么您应该只使用.*. 正如 Marc B 在评论中指出的那样,您应该更喜欢更简单的。如果没有其他原因,那就更容易理解了。如果我遇到第二个......我会想知道最初的意图是什么。.*也有点特殊,您使用的正则表达式引擎有可能对其进行了优化。

但是,如果您正在考虑在命令行上或以编程方式使用这些正则表达式:请谨慎行事。.*将匹配在 Linux 和 Mac OS X 上可能不好的几件事:

  • .目录 - 可能会导致无限递归,具体取决于您在做什么。

  • ..目录 - 将引导您正在运行的任何内容/。如果与递归选项/标志配对,这意味着您正在运行的任何内容都将触及整个文件系统。

  • 隐藏文件 - 隐藏文件以.

而这仅仅是开始。使用捕获大量字符串的正则表达式时要非常小心。但就像我说的,在搜索栏中你应该可以使用.*.

于 2016-09-12T15:13:41.770 回答
0

我的评论我声称,匹配正则表达式的计算时间几乎总是低于读取文件系统的 I/O。这是一个例子,看看正则表达式的速度有多快。我正在使用一些小型 Desktop 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] "^.*\\."

在没有进一步优化的情况下,我花时间 grep 了所有 100 万个文件名:

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

在 grepping 所有文件名的 100 次中,最长持续时间为 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

因此,一颗星在不到一毫秒的时间内被评估,而星点星的翻译在不到 3 毫秒的时间内被评估。这比单星快 3.1 倍。出色地...

于 2016-09-12T15:26:18.220 回答