我们find
在 bash 环境中定义了几个函数,用于在 grep 之前排除文件夹(通常很大或自动生成)。其中一个例子是这样的:
function grepsrc()
{
find . -type d -name .repo -prune -o \
-type d -name .git -prune -o \
-type f -iregex '.*\.\(h\|c\|cc\|cpp\|S\|java\|xml\|sh\|mk\|aidl\|vts\)' \
-exec grep --color=auto -n "$@" {} +
}
使用多个会-o -iname
比使用更快吗-iregex
?
function grepsrc()
{
find . -type d \( -name .repo -o -name .git -o \) -prune -o \
-type f \( -iname '*.h' -o -iname '*.c' -o -iname '*.cc' -o \
-iname '*.cpp' -o -iname '*.S' -o -iname '*.java' -o \
-iname '*.xml' -o -iname '*.sh' -o -iname '*.mk' -o \
-iname '*.aidl' -o -iname '*.vts' \) \
-exec grep --color=auto -n "$@" {} +
}
根据我自己的测试,前者的平均时间为
real 0m3.175s
user 0m3.021s
sys 0m0.145s
而后者的平均
real 0m3.170s
user 0m3.024s
sys 0m0.137s
所以我的数据集没有真正的显着差异,但我可能遗漏了一些东西。
答案1
没有显着差异。
find
受 I/O 限制,而非 CPU 限制。任何字符串操作(例如通配符或正则表达式匹配)都将与磁盘操作相形见绌。所以你上面的结果是可以预料的。
能够(并且通常确实)影响find
性能的是测试的顺序。例如,如果您正在寻找目录,-type d
那么在测试之前移动可以通过告诉它不需要查看文件来-name
加快速度。find
但仅影响名称匹配的更改不会对速度产生任何重大影响。