find -iregex가 -o를 여러 개 사용하는 것보다 더 빠릅니까?

find -iregex가 -o를 여러 개 사용하는 것보다 더 빠릅니까?

findgrep 전에 폴더(일반적으로 크거나 자동으로 생성됨)를 제외하는 여러 기능이 bash 환경에 정의되어 있습니다 . 한 가지 예는 다음과 같습니다.

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

큰 차이는 없습니다.

findI/O 바운드이지 CPU 바운드가 아닙니다. 모든 문자열 작업(예: 와일드카드 또는 정규식 일치)은 디스크 작업보다 작아집니다. 따라서 위의 결과가 예상됩니다.

성능 에 영향을 미칠 수 있는(그리고 종종 영향을 미치는) 것은 find테스트 순서입니다. 예를 들어 디렉터리를 찾고 있는 경우 -type d테스트하기 전에 디렉터리를 이동하면 -name파일을 볼 필요가 없다고 알려서 작업 속도를 높일 수 있습니다. find그러나 이름 일치에만 영향을 미치는 변경 사항은 속도에 큰 영향을 미치지 않습니다.

관련 정보