Como é updatedb
muito mais rápido que find
?
Aqui está uma comparação temporizada entre updatedb
e um find
comando que executa uma tarefa aparentemente semelhante.
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
Meu /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"
Para o comando find, acabei de especificar o ext4
sistema de arquivos, porque esse é o único sistema de arquivos que updatedb
deve acabar procurando. Eu não me incomodei com as extensões de arquivo e não sei como excluir uma montagem de ligação, find
mas não tenho nenhuma. Também adicionei uma exclusão para '/ proc' que parece updatedb
ignorar. Eu também deveria ter ignorado '/ sys'.
Se houver alguma diferença, eu esperaria que o comando find fosse um pouco mais rápido, pois suas regras são um pouco mais simples e não precisam ser gravadas no disco. Em vez disso, updatedb
é muito mais rápido.
$ ./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
O que eles estão fazendo de diferente?
set -x
para ativar a impressão de comandos antes que eles sejam executados, para que você não precise das travessuras de avaliação.Respostas:
Consulte a página do manual para
updatedb
"Se o banco de dados já existir, seus dados serão reutilizados para evitar reler diretórios que não foram alterados".Enquanto o
find
comando percorre todos os diretórios, independentemente de terem sido alterados.fonte