Як оновлюєтьсяb набагато швидше, ніж знаходити?


11

Як це updatedbнабагато швидше, ніж find?

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

порівняти.ш

#!/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/updateb.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

Що вони роблять по-іншому?


використовувати set -xдля ввімкнення друку команд перед їх виконанням, тому вам не знадобляться шваляни.
Пітер Кордес

Відповіді:


15

Див. Головну сторінку updatedb"Якщо база даних вже існує, її дані повторно використовуються, щоб уникнути повторного читання каталогів, які не змінилися".

Тоді як findкоманда обходить усі каталоги незалежно від того, змінилися вони.


1
Як це можна перевірити таку річ: stackoverflow.com/questions/3620684 / ...
Praxeolitic
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.