Làm thế nào được cập nhật nhanh hơn nhiều so với tìm thấy?


11

Làm thế nào là updatedbnhanh hơn nhiều find?

Đây là một so sánh đúng thời gian giữa updatedbvà một findlệnh thực hiện một nhiệm vụ có vẻ tương tự nhau.

so sánh

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

My /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"

Đối với lệnh find tôi chỉ chỉ định ext4hệ thống tập tin vì đó là hệ thống tập tin duy nhất updatedbnên xem qua. Tôi không bận tâm với các phần mở rộng tập tin và tôi không biết làm thế nào để loại trừ một liên kết gắn kết khỏi findnhưng tôi không có. Tôi cũng đã thêm một loại trừ cho '/ Proc' mà dường như updatedbbỏ qua. Tôi cũng nên bỏ qua '/ sys'.

Nếu có bất kỳ sự khác biệt nào, tôi hy vọng lệnh find sẽ nhanh hơn một chút vì các quy tắc của nó đơn giản hơn một chút và nó không phải ghi vào đĩa. Thay vào đó updatedblà nhanh hơn nhiều.

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

Họ đang làm gì khác nhau?


sử dụng set -xđể bật in các lệnh trước khi chúng được thực thi, vì vậy bạn không cần các shenanigans eval.
Peter Cordes

Câu trả lời:


15

Xem trang hướng dẫn updatedb, "Nếu cơ sở dữ liệu đã tồn tại, dữ liệu của nó được sử dụng lại để tránh các thư mục đọc lại không thay đổi".

Trong khi đó findlệnh đi qua tất cả các thư mục bất kể chúng có thay đổi hay không.


1
Làm thế nào có thể kiểm tra một thứ như vậy: stackoverflow.com/questions/3620684/iêu
Praxeolitic
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.