Bagaimana updateb jauh lebih cepat daripada menemukan?

11

Bagaimana updatedbjauh lebih cepat daripada find?

Berikut ini adalah perbandingan waktunya antara updatedbdan findperintah yang melakukan tugas yang tampaknya serupa.

bandingkan.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 saya:

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"

Untuk perintah find, saya hanya menentukan ext4filesystem karena hanya sistem file yang updatedbharus dicari. Saya tidak peduli dengan ekstensi file dan saya tidak tahu cara mengecualikan bind mount dari findtetapi saya tidak punya. Saya juga menambahkan pengecualian untuk '/ proc' yang tampaknya updatedbmengabaikan. Seharusnya saya juga mengabaikan '/ sys'.

Jika ada perbedaan, saya berharap perintah find menjadi sedikit lebih cepat karena aturannya sedikit lebih sederhana dan tidak harus menulis ke disk. Sebaliknya updatedbjauh lebih cepat.

$ ./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

Apa yang mereka lakukan secara berbeda?

Praxeolitic
sumber
gunakan set -xuntuk mengaktifkan pencetakan perintah sebelum dieksekusi, jadi Anda tidak perlu evan shenanigans.
Peter Cordes

Jawaban:

15

Lihat halaman manual untuk updatedb, "Jika database sudah ada, datanya digunakan kembali untuk menghindari membaca ulang direktori yang tidak berubah".

Padahal findperintah tersebut melintasi semua direktori tanpa memandang apakah sudah berubah.

steve
sumber
1
Bagaimana mungkin untuk memeriksa hal seperti itu: stackoverflow.com/questions/3620684/...
Praxeolitic