Saya mencoba mencari file yang tidak ada di direktori home saya dan semua subdirektori.
find ~/ -name "bogus"
memberi saya informasi itu setelah beberapa detik, namun manajer file KDEdolphin
membutuhkan hampir 3 menit untuk melakukan hal yang sama. Ini sesuai dengan pengalaman saya sebelumnya dengan GNOMEbeagle
.
Bagaimana cara find
melakukan hal yang sama dengan sangat cepat sementara pencarian grafis (yang lebih intuitif untuk digunakan daripada parameter commandline) siput di belakang?
find
performance
dolphin
Merah
sumber
sumber
locate
lebih sering daripadafind
dan lebih cepat di folder besarlocate
sangat bagus untuk menemukan file, ini sedikit OT, karena menggunakan pendekatan yang sama sekali berbeda:find
dan alat GUI sepertiDolphin
melintasi pohon file sesuai permintaan, sementaralocate
menggunakan struktur indeks yang dibuat sebelumnya.Jawaban:
Melihat Dolphin dengan Baloo secara khusus, tampaknya mencari metadata setiap file dalam domain pencariannya, bahkan jika Anda melakukan pencarian nama file sederhana. Ketika saya melacak
file.so
proses, saya melihat panggilan kelstat
,getxattr
dangetxattr
lagi untuk setiap file, dan bahkan untuk..
entri. Panggilan sistem ini mengambil metadata tentang file yang disimpan di lokasi yang berbeda dari nama file (nama file disimpan dalam isi direktori, tetapi metadata berada di inode ). Meminta metadata file berkali-kali adalah murah karena data akan berada di cache disk, tetapi mungkin ada perbedaan yang signifikan antara meminta metadata dan tidak meminta metadata.find
jauh lebih pintar. Mencoba menghindari panggilan sistem yang tidak perlu. Itu tidak akan memanggilgetxattr
karena tidak mencari berdasarkan atribut yang diperluas. Ketika melintasi direktori, mungkin perlu memanggillstat
nama file yang tidak cocok karena itu mungkin subdirektori untuk mencari secara rekursif (lstat
adalah panggilan sistem yang mengembalikan metadata file termasuk jenis file seperti biasa / direktori / symlink / ...). Namunfind
memiliki pengoptimalan: ia tahu berapa banyak subdirektori yang dimiliki suatu direktori dari jumlah tautannya , dan ia berhenti memanggillstat
begitu ia mengetahui bahwa subdirektori melintasi semua subdirektori. Secara khusus, dalam direktori daun (direktori tanpa subdirektori),find
hanya memeriksa nama, bukan metadata. Selain itu beberapa sistem file menyimpan salinan jenis file dalam entri direktori sehinggafind
bahkan tidak perlu memanggillstat
jika hanya itu informasi yang diperlukan.Jika Anda menjalankan
find
dengan opsi yang perlu memeriksa metadata, itu akan membuat lebih banyaklstat
panggilan, tetapi itu tetap tidak akan membuatlstat
panggilan pada file jika tidak memerlukan informasi (misalnya karena file tersebut dikecualikan oleh kondisi sebelumnya sesuai dengan namanya).Saya menduga bahwa alat pencarian GUI lain yang menemukan kembali
find
roda sama kurang pintar dari utilitas baris perintah yang telah mengalami beberapa dekade optimasi. Dolphin, setidaknya, cukup pintar untuk menggunakan basis data lokasi jika Anda mencari "di mana-mana" (dengan batasan yang tidak jelas di UI bahwa hasilnya mungkin kedaluwarsa).sumber
2 + number of sub-directories.
Ini berfungsi untuk filesystem yang mengimplementasikan bug desain dari UNIX V7 filesystem, tetapi tidak untuk semua filesystem, karena ini bukan persyaratan POSIX . Jika Anda ingin mendapatkan nomor kinerja yang berguna untuk pembuatan GNU, Anda perlu menentukan-noleaf
untuk memberi tahu GNU agar berperilaku dengan benar.find
mungkin , GNU mungkin sudah memiliki bug itu sejak lama, tapi saya ragu Anda akan menemukan case di mana Anda perlu menentukan-noleaf
dengan tangan saat ini. AFAICT, di Linux setidaknyagetdents()
(dan readdir ()) memberi tahu file mana yang merupakan file direktori pada UDF, ISO-9660, btrfs yang tidak memiliki entri.
atau nyata..
danfind
berperilaku OK di sana. Apakah Anda tahu satu kasus di mana GNUfind
menunjukkan masalahnya?find
. Dan bagaimanapun,strace -v
menunjukkan bahwagetdents()
dengan benar mengembalikan d_type = DT_DIR untuk direktori, jadi GNU menemukan tidak harus menggunakan trik penghitungan tautan.