让我们说我需要提供一个过滤器来匹配给定文件系统中的所有文件,不一定是在linux中,而且还需要将IDE中的所有文件与支持基于正则表达式的过滤的巨大代码库进行匹配。使用
之间是否存在显着的性能差异*
VS
*。 *
注意:请忽略上面表达式中的额外空格,在没有空格的情况下发布它会因某种原因而成为点。
假设所有文件都有扩展名,则这些表达式是同一个。但是,我想知道是否其中任何一个优于另一个,特别是当有大量文件要匹配时。
答案 0 :(得分:1)
性能会因一个正则表达式引擎而异,所以我们无法确切地说。作为Bernhard shows in his answer,I / O比任何一个正则表达式都要贵。
然而,您真正使用的正则表达式将是:
.*
- 匹配任何包含0个或更多字符的字符串。
和
.*\..*
- 匹配一个包含0个或更多字符的字符串,后跟一个句点,后跟一个包含0个或更多字符的字符串。
如果您要做的就是将它放在文件浏览器/浏览器和IDE中符合正则表达式的搜索栏中,那么您应该只使用.*
。正如Marc B在评论中指出的那样,你应该更喜欢更简单的一个。如果没有其他原因,它更容易理解。如果我遇到第二个......我会想知道最初的意图是什么。 .*
也很特别,你正在使用的正则表达式引擎有可能优化它。
但是,如果您正在考虑在命令行上使用这些正则表达式或以编程方式使用这些正则表达式:请谨慎使用。 .*
将匹配Linux和Mac OS X上可能有问题的几件事:
.
目录 - 可能会导致无限递归,具体取决于您正在做什么。
..
目录 - 将引导您运行的任何内容/
。如果与递归选项/标志配对,这意味着无论您运行的是什么,都将触及整个文件系统。
隐藏文件 - 隐藏文件以.
而这仅仅是个开始。在使用捕获大量字符串的正则表达式时,要非常小心。但就像我说的那样,在搜索栏中你可以使用.*
。
答案 1 :(得分:0)
我的评论我声称,匹配正则表达式的计算时间几乎总是低于读取文件系统的I / O.这是一个例子,看看正则表达式有多快。我正在使用一些小型桌面i5 @ 3.1Ghz 8MB RAM - 不是数字计算机,但也不错。许多人会使用类似的东西。我正在使用R,这是一种易于测量时间的解释性语言。
包含8个字母的100万个文件名的随机样本指向3个字母,与旧DOS时间相同。代码是:
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万个文件名:
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次中,最长持续时间为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毫秒。
对于更真实的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更快。嗯......