Como o updatedb é muito mais rápido que o find?

11

Como o updatedb é muito mais rápido que o find ?

Aqui está uma comparação cronometrada entre o comando updatedb e o find que faz uma tarefa aparentemente similar.

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 ext4 filesystem porque esse é o único sistema de arquivos que o updatedb deve procurar. Eu não me incomodei com as extensões de arquivo e não sei como excluir uma montagem de bind de find , mas não tenho nenhuma. Eu também adicionei uma exclusão para '/ proc', que parece que updatedb ignora. Eu deveria também ter ignorado '/ sys'.

Se houvesse alguma diferença, esperaria que o comando find fosse um pouco mais rápido, já que as regras são um pouco mais simples e não precisam gravar 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?

    
por Praxeolitic 03.07.2015 / 00:05

1 resposta

14

Veja a página do manual para updatedb , "Se o banco de dados já existir, seus dados serão reutilizados para evitar a releitura de diretórios que não foram alterados".

Considerando que o comando find percorre todos os diretórios, independentemente de terem mudado.

    
por 03.07.2015 / 00:15