Quanto è aggiornatob molto più veloce di trovare?


11

Quanto è updatedbmolto più veloce di find?

Ecco un confronto a tempo tra updatedbe un findcomando che svolge un'attività apparentemente simile.

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

Il mio /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"

Per il comando find ho appena specificato il ext4filesystem perché quello è l'unico filesystem che updatedbdovrebbe finire per cercare. Non mi sono preoccupato delle estensioni dei file e non so come escludere un mount bind da findma non ne ho. Ho anche aggiunto un'esclusione per '/ proc' che sembra updatedbignorare. Avrei dovuto ignorare anche '/ sys'.

Se ci fosse qualche differenza, mi aspetto che il comando find sia un po 'più veloce poiché le sue regole sono un po' più semplici e non devono scrivere su disco. Invece updatedbè molto più veloce.

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

Cosa stanno facendo diversamente?


utilizzare set -xper attivare la stampa dei comandi prima che vengano eseguiti, quindi non è necessario lo shenanigans eval.
Peter Cordes,

Risposte:


15

Vedere la pagina man per updatedb"Se il database esiste già, i suoi dati vengono riutilizzati per evitare di rileggere le directory che non sono cambiate".

Considerando che il findcomando attraversa tutte le directory indipendentemente dal fatto che siano state modificate.


1
Come è possibile verificare cosa del genere un: stackoverflow.com/questions/3620684/...
Praxeolitic
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.