Как обновляется намного быстрее, чем найти?

11

Как updatedbэто намного быстрее, чем find?

Вот сравнение по времени updatedbи findкоманды, которая выполняет, казалось бы, похожую задачу.

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

Мой /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"

Для команды find я только что указал ext4файловую систему, потому что это единственная файловая система, которая updatedbдолжна просматриваться. Я не беспокоился о расширениях файлов, и я не знаю, как исключить привязку из, findно у меня их нет. Я также добавил исключение для '/ proc', которое, похоже, updatedbигнорирует. Я должен был также проигнорировать '/ sys'.

Если бы была какая-то разница, я бы ожидал, что команда find будет немного быстрее, поскольку ее правила немного проще и ей не нужно записывать на диск. Вместо этого updatedbнамного быстрее.

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

Что они делают по-другому?

Praxeolitic
источник
используйте, set -xчтобы включить печать команд перед их выполнением, чтобы вам не понадобилось eval shenanigans.
Питер Кордес

Ответы:

15

См. Справочную страницу для updatedb: «Если база данных уже существует, ее данные используются повторно, чтобы избежать перечитывания каталогов, которые не изменились».

Принимая во внимание, что findкоманда пересекает все каталоги независимо от того, были ли они изменены.

Стив
источник
1
Как это можно проверить: stackoverflow.com/questions/3620684/…
Praxeolitic