Comment updateb est-il tellement plus rapide que find?

11

Comment est updatedbtellement plus rapide que find?

Voici une comparaison minutée entre updatedbet une findcommande qui effectue une tâche apparemment similaire.

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

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

Pour la commande find, je viens de spécifier le ext4système de fichiers parce que c'est le seul système de fichiers qui updatedbdevrait finir par chercher. Je n'ai pas pris la peine des extensions de fichier et je ne sais pas comment exclure un montage de liaison, findmais je n'en ai pas. J'ai également ajouté une exclusion pour «/ proc» qui semble updatedbignorer. J'aurais également dû ignorer «/ sys».

S'il y avait une différence, je m'attendrais à ce que la commande find soit un peu plus rapide car ses règles sont un peu plus simples et elle n'a pas besoin d'écrire sur le disque. Au lieu de cela, updatedbc'est beaucoup plus rapide.

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

Que font-ils différemment?

Praxéolitique
la source
utilisez set -xpour activer l'impression des commandes avant leur exécution, vous n'avez donc pas besoin des manigances d'évaluation.
Peter Cordes

Réponses:

15

Consultez la page de manuel pour updatedb"Si la base de données existe déjà, ses données sont réutilisées pour éviter de relire les répertoires qui n'ont pas changé".

Alors que la findcommande parcourt tous les répertoires, qu'ils aient changé ou non.

Steve
la source
1
Comment il est possible de vérifier une telle chose: stackoverflow.com/questions/3620684/…
Praxeolitic