updateb가 find보다 훨씬 빠른 이유는 무엇입니까?

updateb가 find보다 훨씬 빠른 이유는 무엇입니까?

updatedb왜 그렇게 더 빨라 졌나요 find?

다음은 유사해 보이는 작업을 수행하는 명령 updatedb간의 타이밍 비교 입니다.find

비교.sh

#!/usr/bin/env bash

cmd="sudo updatedb"
echo $cmd
time eval $cmd

cmd="sudo find / \
    -fstype ext4 \
    -not \( \
        -path '/afs/*' -o \
        -path '/net/*' -o \
        -path '/sfs/*' -o \
        -path '/tmp/*' -o \
        -path '/udev/*' -o \
        -path '/var/cache/*' -o \
        -path '/var/lib/pacman/local/*' -o \
        -path '/var/lock/*' -o \
        -path '/var/run/*' -o \
        -path '/var/spool/*' -o \
        -path '/var/tmp/*' -o \
        -path '/proc/*' \
    \) &>/dev/null"

echo $cmd
time eval $cmd

내 /etc/updatedb.conf:

PRUNE_BIND_MOUNTS = "yes"
PRUNEFS = "9p afs anon_inodefs auto autofs bdev binfmt_misc cgroup cifs coda configfs cpuset cramfs debugfs devpts devtmpfs ecryptfs exofs ftpfs fuse fuse.encfs fuse.sshfs fusectl gfs gfs2 hugetlbfs inotifyfs iso9660 jffs2 lustre mqueue ncpfs nfs nfs4 nfsd pipefs proc ramfs rootfs rpc_pipefs securityfs selinuxfs sfs shfs smbfs sockfs sshfs sysfs tmpfs ubifs udf usbfs vboxsf"
PRUNENAMES = ".git .hg .svn"
PRUNEPATHS = "/afs /net /sfs /tmp /udev /var/cache /var/lib/pacman/local /var/lock /var/run /var/spool /var/tmp"

find 명령의 경우 최종적으로 찾아야 하는 ext4유일한 파일 시스템이기 때문에 파일 시스템을 지정했습니다 . updatedb나는 파일 확장자에 관심이 없고 바인드 마운트를 제외하는 방법을 모르지만 find그렇지 않습니다. "/proc"에 대한 제외도 추가했는데 updatedb무시되는 것 같습니다. "/sys"도 무시해야 합니다.

오히려 규칙이 더 간단하고 디스크에 쓸 필요가 없기 때문에 find 명령이 조금 더 빨랐으면 좋겠습니다. 오히려 updatedb훨씬 빠릅니다.

$ ./compare.sh
sudo updatedb

real    0m0.876s
user    0m0.443s
sys 0m0.273s

sudo find / -fstype ext4 -not \( -path '/afs/*' -o -path '/net/*' -o -path '/sfs/*' -o -path '/tmp/*' -o -path '/udev/*' -o -path '/var/cache/*' -o -path '/var/lib/pacman/local/*' -o -path '/var/lock/*' -o -path '/var/run/*' -o -path '/var/spool/*' -o -path '/var/tmp/*' -o -path '/proc/*' \) &>/dev/null

real    6m23.499s
user    0m14.527s
sys 0m10.993s

그들은 어떻게 다르게 합니까?

답변1

updatedb"데이터베이스가 이미 존재하는 경우 변경되지 않은 디렉토리를 다시 읽지 않도록 해당 데이터를 재사용하십시오" 매뉴얼 페이지를 참조하십시오 .

그리고 이 find명령은 변경 여부에 관계없이 모든 디렉터리를 반복합니다.

관련 정보