find -iregex 比使用多个 -o 更快吗?

find -iregex 比使用多个 -o 更快吗?

我们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但仅影响名称匹配的更改不会对速度产生任何重大影响。

相关内容