find
grep 전에 폴더(일반적으로 크거나 자동으로 생성됨)를 제외하는 여러 기능이 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
큰 차이는 없습니다.
find
I/O 바운드이지 CPU 바운드가 아닙니다. 모든 문자열 작업(예: 와일드카드 또는 정규식 일치)은 디스크 작업보다 작아집니다. 따라서 위의 결과가 예상됩니다.
성능 에 영향을 미칠 수 있는(그리고 종종 영향을 미치는) 것은 find
테스트 순서입니다. 예를 들어 디렉터리를 찾고 있는 경우 -type d
테스트하기 전에 디렉터리를 이동하면 -name
파일을 볼 필요가 없다고 알려서 작업 속도를 높일 수 있습니다. find
그러나 이름 일치에만 영향을 미치는 변경 사항은 속도에 큰 영향을 미치지 않습니다.