我有一个使用正则表达式查找文件的脚本。代码如下:
find $dir | grep "$regex"
脚本运行有点太慢,我想优化它。搜索需要一些时间来执行,我希望从中获得更好的性能。我试过这个尝试:
find $dir -regex ".*${regex}.*"
由于没有创建额外的进程来解析正则表达式,因此我希望结果稍快一些。
然而结果是不同的,令我惊讶的是,命令“find | grep”比“find -regex”更快(虽然它需要更多的系统时间,正如人们所期望的那样)
我定时了这个行为:
查找| grep结果
real 0m12.467s
user 0m2.568s
sys 0m7.260s
查找-regex结果
real 0m16.778s
user 0m6.772s
sys 0m6.380s
您是否知道为什么find -regex解决方案更慢?
答案 0 :(得分:5)
最有可能因为grep
及其正则表达式引擎多年来一直被高度优化,因为这是它唯一的目的(“做一件事,做得好”)。我不知道正则表达式引擎find
使用了什么,但它显然不像grep
那样高度精炼,可能是因为它是一种不太常用的辅助功能。
此外,如果您正在使用此文件列表执行任何操作,那么您应该使用更加空白安全的方法来执行此操作。我不认为grep
可以采用以空分隔的输入(虽然它可以输出它),所以你应该使用find [...] -regex [...] -print0
,即使它更慢。