web-dev-qa-db-ja.com

updatebはfindよりもはるかに高速ですか?

updatedbfindよりもどのように高速ですか?

これは、updatedbと一見似たようなタスクを実行するfindコマンドの時限比較です。

compare.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からバインドマウントを除外する方法がわかりませんが、何もありません。また、updatedbが無視しているように見える '/ proc'の除外を追加しました。 '/ 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

彼らは何が違うのですか?

11
Praxeolitic

updatedbのマニュアルページを参照してください。「データベースがすでに存在する場合、変更されていないディレクトリの再読み取りを回避するために、そのデータが再利用されます」。

一方、findコマンドは、ディレクトリが変更されたかどうかに関係なく、すべてのディレクトリをトラバースします。

15
steve