"find" 매개변수 명령의 성능 정보

"find" 매개변수 명령의 성능 정보

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]  ) 

관련 정보