假设我需要提供一个过滤器来匹配给定文件系统中的所有文件,不一定是在 linux 中,但也用于匹配 IDE 中的所有文件,以及支持基于正则表达式的过滤的庞大代码库。使用之间是否有任何显着的性能差异
*
对比
*。*
注意:请忽略上面表达式中多余的空格,不带空格的发布由于某种原因会变成一个点。
假设所有文件都有扩展名,这些表达式是相同的。但是,我想知道其中任何一个是否优于另一个,尤其是当有大量文件要匹配时。
假设我需要提供一个过滤器来匹配给定文件系统中的所有文件,不一定是在 linux 中,但也用于匹配 IDE 中的所有文件,以及支持基于正则表达式的过滤的庞大代码库。使用之间是否有任何显着的性能差异
*
对比
*。*
注意:请忽略上面表达式中多余的空格,不带空格的发布由于某种原因会变成一个点。
假设所有文件都有扩展名,这些表达式是相同的。但是,我想知道其中任何一个是否优于另一个,尤其是当有大量文件要匹配时。
性能会因一个正则表达式引擎而异,所以我们不能确定。正如 Bernhard在他的回答中显示的那样,I/O 比任何一个正则表达式都贵。
但是,您真正使用的正则表达式将是这些:
.*
- 匹配任何包含 0 个或更多字符的字符串。
和
.*\..*
- 匹配一个包含 0 个或多个字符的字符串,后跟一个句点,然后是一个包含 0 个或多个字符的字符串。
如果您要做的只是将其放在文件资源管理器/浏览器和 IDE 中符合正则表达式的搜索栏中,那么您应该只使用.*
. 正如 Marc B 在评论中指出的那样,您应该更喜欢更简单的。如果没有其他原因,那就更容易理解了。如果我遇到第二个......我会想知道最初的意图是什么。.*
也有点特殊,您使用的正则表达式引擎有可能对其进行了优化。
但是,如果您正在考虑在命令行上或以编程方式使用这些正则表达式:请谨慎行事。.*
将匹配在 Linux 和 Mac OS X 上可能不好的几件事:
该.
目录 - 可能会导致无限递归,具体取决于您在做什么。
该..
目录 - 将引导您正在运行的任何内容/
。如果与递归选项/标志配对,这意味着您正在运行的任何内容都将触及整个文件系统。
隐藏文件 - 隐藏文件以.
而这仅仅是开始。使用捕获大量字符串的正则表达式时要非常小心。但就像我说的,在搜索栏中你应该可以使用.*
.
我的评论我声称,匹配正则表达式的计算时间几乎总是低于读取文件系统的 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 倍。出色地...