GNU를 사용할 때 필터링 순서에 따라 눈에 띄는 성능 차이가 있는지 궁금합니다 find
.
예를 들어 현재 경로에서 이름이 일치하는 모든 디렉터리를 검색하고 싶습니다 *manifest*
.
아래 두 명령 사이에 내부 차이점이 있습니까? 즉, 순서가 중요합니까?
find -type d -iname "*manifest*"
또는
find -iname "*manifest*" -type d
참고: 경로에 많은 수의 파일이 포함되어 있기 때문에 성능 차이가 걱정됩니다.
답변1
구문은 다음 find
과 같습니다.
find [-H] [-L] [-P] [-D debugopts] [-Olevel] [path...] [expression]
귀하의 경우 -iname
및 -type
둘 다 표현입니다. 따라서 하나를 먼저 사용하고 다른 하나를 사용하는 데에는 문제가 없습니다.
설명에서:
GNU find는 주어진 각 파일 이름에 루트가 있는 디렉토리 트리를 검색합니다.주어진 표현식은 우선순위 규칙에 따라 왼쪽에서 오른쪽으로 평가됩니다(연산자 섹션 참조)., 결과가 알려질 때까지(왼쪽은 and 연산의 경우 false이고 or 연산의 경우 true입니다), 그 시점에서 find는 다음 파일 이름으로 이동합니다.
- For
find -type d -iname "*manifest*"
: 먼저 디렉토리만 테스트한 다음"*manifest*"
. - For
find -iname "*manifest*" -type d
: 이름 일치를 먼저 테스트한"*manifest*"
다음 디렉터리만 테스트합니다.
그리고 서로 다른 주문을 실행하면 발견된 성과에 큰 차이가 발생할 수 있습니다.
그리고 최적화를 find
위해최적화 옵션다음과 같이:
-Olevel
Enables query optimisation. The find program reorders tests to speed up execution while preserving
the overall effect; that is, predicates with side effects are not reordered relative to each other.
The optimisations performed at each optimisation level are as follows.
0 Equivalent to optimisation level 1.
1 This is the default optimisation level and corresponds to the traditional behaviour. Expres‐
sions are reordered so that tests based only on the names of files (for example -name and
-regex) are performed first.
2 Any -type or -xtype tests are performed after any tests based only on the names of files, but
before any tests that require information from the inode. On many modern versions of Unix, file
types are returned by readdir() and so these predicates are faster to evaluate than predicates
which need to stat the file first.
3 At this optimisation level, the full cost-based query optimiser is enabled. The order of tests
is modified so that cheap (i.e. fast) tests are performed first and more expensive ones are per‐
formed later, if necessary. Within each cost band, predicates are evaluated earlier or later
according to whether they are likely to succeed or not. For -o, predicates which are likely to
succeed are evaluated earlier, and for -a, predicates which are likely to fail are evaluated
earlier.
현재 명령줄 구문 분석 최적화를 사용하려면 디버깅을 위해 보내고 -D
얻을 수 있습니다.최적화된 명령줄.
opt Prints diagnostic information relating to the optimisation of the expression tree;
최종 find -D opt -type d -iname "*manifest*"
출력:
Optimized command line:
( -iname *manifest* [0.8] -a [0.4] [need type] -type d [0.4] )