Wie ist updateb so viel schneller als find?

11

Wie ist updatedbso viel schneller als find?

Hier ist ein zeitgesteuerter Vergleich zwischen updatedbund einem findBefehl, der eine scheinbar ähnliche Aufgabe ausführt.

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

Meine /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"

Für den Befehl find habe ich gerade das ext4Dateisystem angegeben, da dies das einzige Dateisystem updatedbist, das durchgesehen werden sollte. Ich habe mich nicht um die Dateierweiterungen gekümmert und weiß nicht, wie ich einen Bind-Mount ausschließen soll, findaber ich habe keine. Ich habe auch einen Ausschluss für '/ proc' hinzugefügt, der anscheinend updatedbignoriert wird. Ich hätte auch '/ sys' ignorieren sollen.

Wenn es einen Unterschied geben würde, würde ich erwarten, dass der Befehl find etwas schneller ist, da seine Regeln etwas einfacher sind und nicht auf die Festplatte geschrieben werden müssen. Stattdessen updatedbist viel schneller.

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

Was machen sie anders?

Praxeolitisch
quelle
verwenden set -xzum Drucken von Befehlen zu drehen , bevor sie ausgeführt sind, so dass Sie nicht die eval Spielereien brauchen.
Peter Cordes

Antworten:

15

In der Manpage finden Sie updatedbInformationen zu "Wenn die Datenbank bereits vorhanden ist, werden ihre Daten wiederverwendet, um ein erneutes Lesen von Verzeichnissen zu vermeiden, die sich nicht geändert haben".

Während der findBefehl alle Verzeichnisse durchläuft, unabhängig davon, ob sie geändert wurden.

Steve
quelle
1
Wie es möglich ist, so etwas zu überprüfen: stackoverflow.com/questions/3620684/…
Praxeolitic