Bukan percepatan mendasar tapi setidaknya sesuatu :)
find . -printf \\n | wc -l
Anda benar-benar tidak perlu melewati daftar nama file, cukup baris baru saja. Varian ini sekitar 15% lebih cepat di Ubuntu 12.04.3 saya ketika direktori di-cache di RAM. Selain itu varian ini akan bekerja dengan benar dengan nama file yang mengandung baris baru.
Menariknya varian ini tampaknya sedikit lebih lambat dari yang di atas:
find . -printf x | wc -c
Kasus khusus - tetapi sangat cepat
Jika direktori berada pada sistem filenya sendiri, Anda cukup menghitung inode:
df -i .
Jika jumlah direktori dan file di direktori lain selain yang dihitung tidak banyak berubah, Anda cukup mengurangi angka yang diketahui ini dari df -i
saat ini hasil. Dengan cara ini Anda dapat menghitung file dan direktori dengan sangat cepat.
Saya telah menulis ffcnt untuk tujuan itu. Itu mengambil sendiri offset fisik dari direktori dengan fiemap
ioctl dan kemudian menjadwalkan traversal direktori dalam beberapa lintasan berurutan untuk mengurangi akses acak. Apakah Anda benar-benar mendapatkan percepatan dibandingkan dengan find | wc
tergantung pada beberapa faktor:
- tipe sistem file:sistem file seperti ext4 yang mendukung
fiemap
ioctl akan sangat diuntungkan - kecepatan akses acak:HDD jauh lebih bermanfaat daripada SSD
- tata letak direktori:semakin tinggi jumlah direktori bertingkat, semakin besar potensi pengoptimalan
(kembali)memasang dengan relatime
atau bahkan nodiratime
juga dapat meningkatkan kecepatan (untuk semua metode) ketika akses sebaliknya akan menyebabkan pembaruan metadata.
Sebenarnya, di sistem saya (Arch Linux) perintah ini
ls -A | wc -l
lebih cepat dari semua yang di atas:
$ time find . | wc -l
1893
real 0m0.027s
user 0m0.004s
sys 0m0.004s
$ time find . -printf \\n | wc -l
1893
real 0m0.009s
user 0m0.000s
sys 0m0.008s
$ time find . -printf x | wc -c
1893
real 0m0.009s
user 0m0.000s
sys 0m0.008s
$ time ls -A | wc -l
1892
real 0m0.007s
user 0m0.000s
sys 0m0.004s