Mengoptimalkan kecepatan fzf pada dataset besar: memilih algoritma dengan --algo, membatasi item sebelum masuk, keputusan --sort, dan meringankan beban preview. Termasuk peningkatan performa fzf modern yang skalanya linear antar core CPU, pengurangan jejak cache memori, serta strategi praktis menangani jutaan item.

Di episode 16 kalian membuat daftar fzf menjadi hidup — reload berkala, query yang diteruskan ke ripgrep, dan bahkan kendali dari proses eksternal lewat --listen. Semua itu terasa ajaib ketika daftarnya seribu baris. Tetapi apa yang terjadi ketika daftarnya satu juta baris? Di sinilah pertanyaan sejati tentang fzf dimulai: seberapa cepat ia bisa menyaring, dan bagaimana kita menjaganya tetap cepat.
Episode ini membahas performa fzf dari dua sisi. Sisi yang bisa kalian kendalikan: memilih algoritma dengan --algo, membatasi jumlah item sebelum masuk, keputusan --sort, dan meringankan beban preview. Sisi yang datang dari pengembang: kemampuan fzf modern yang skalanya linear antar core CPU dan pengurangan drastis jejak cache memori sejak 0.71 — plus strategi praktis menangani dataset berukuran jutaan.
Prinsip pertama yang harus dipahami: fzf adalah filter yang berjalan dalam pipeline, dan pipeline hanya secepat komponen yang paling lambat. Daftar yang lambat dibuat di hulu tidak akan terselamatkan oleh fzf yang super cepat di hilir. Kinerja adalah tanggung jawab seluruh rantai, bukan hanya ujung yang terlihat.
Beban fzf terbagi dalam tiga tahap yang berjalan sebagian paralel:
Ketiganya tidak seimbang. Untuk daftar besar, matching mendominasi; untuk daftar kecil, preview sering kali justru yang paling lambat. Mengoptimalkan berarti tahu di tahap mana waktu kalian terbakar, bukan sekadar menyalakan semua opsi "cepat" sekaligus.
--algofzf menyediakan dua algoritma pencocokan fuzzy. v2 adalah default — algoritma optimal scoring yang menghasilkan kualitas ranking terbaik. v1 adalah algoritma gaya lama (seperti yang dipakai fzy) yang lebih sederhana, dengan trade-off kualitas ranking yang lebih kasar.
fzf --algo v2
fzf --algo v1Note
--algo menentukan kualitas ranking, bukan sekadar kecepatan. v2 memilih hasil yang paling relevan ketika banyak item cocok dengan skor dekat; v1 lebih mudah "salah urutan" pada daftar besar. Mulailah dari v2 (default) dan turun ke v1 hanya jika pengukuran kalian menunjukkan bahwa scoring bukan bottleneck — jangan menurunkan kualitas tanpa data.
Aturan pertama dataset besar: jangan kirim lebih dari yang dibutuhkan. Setiap baris yang masuk fzf harus disimpan, diindeks, dan berpotensi di-scoring. Baris yang tidak pernah akan kalian pilih hanyalah sampah yang membuat segalanya lambat.
Dua cara yang paling efektif: batasi sumbernya (filter di hulu dengan fd atau rg, bukan find), dan pangkas ukurannya (head) ketika kalian hanya peduli pada bagian awal:
fd -t f . ~ | head -n 5000 | fzftail -f /var/log/app.log | fzf --tail 100000 --tac --no-sort --exactContoh kedua ini memakai fitur --tail: dari aliran log yang tidak pernah berakhir, fzf hanya menyimpan 100.000 baris terakhir — daftar tetap terbatas meski sumbernya tak berujung.
--sortSorting adalah salah satu operasi paling mahal di fzf. Secara default (--sort), fzf mengurutkan hasil berdasarkan skor kecocokan. Ketika daftar raksasa dan urutan sudah bermakna — history yang ingin tetap kronologis, log yang ingin tetap berurutan — --no-sort menghapus biaya itu dan mempertahankan urutan input apa adanya:
seq 1000000 | fzf --sort
seq 1000000 | fzf --no-sortUntuk hasil imbang pada --sort, --tiebreak menentukan kriteria pembeda. Pada dataset besar, kombinasi --no-sort --exact adalah jalan pintas yang sah: item tetap disaring, tetapi pekerjaan scoring yang berat dilewati.
Tip
Ukur sebelum memilih. time adalah sahabat kalian: bandingkan seq 1000000 | fzf --sort < /dev/null dengan versi --no-sort dan lihat perbedaannya di mesin kalian sendiri. Optimalisasi tanpa pengukuran hanyalah dugaan yang tampak ilmiah.
Ketika daftar sudah besar, sering kali yang terasa lambat bukan filter-nya melainkan preview. Setiap kali kursor berpindah, perintah preview dijalankan ulang. Tiga penyesuaian yang paling berdampak:
head dan sed jauh lebih ringan daripada tool yang mem-parse seluruh file.bat dengan --style=plain dan tanpa --color=always menghindari kerja parsing warna.--preview-window yang kecil dan perintah yang hanya membaca beberapa baris membatasi kerja per perpindahan.fzf --preview 'head -n 30 {}'
fzf --preview 'bat --style=plain {}'Sekarang mari ke sisi pengembang. Sejak fzf 0.71, kinerja pencarian fzf menjadi scalable secara linear di seluruh core CPU: pekerjaan matching dibagi ke semua inti prosesor yang tersedia, sehingga daftar yang sama dua kali lebih besar tidak berarti waktu dua kali lipat jika ada core untuk dikerjakan. Ini berbeda dari versi lama yang sebagian besar berjalan pada satu inti.
Dampak praktisnya: pada mesin multicore modern, fzf memfilter ratusan ribu hingga jutaan baris dengan latensi yang tidak lagi terasa — selama data melewatinya secara streaming, bukan menunggu seluruh input terkumpul.
Bersamaan dengan itu, rilis 0.71 mencatat pengurangan 86x pada jejak cache memori per entri. Angka besar itu berasal dari penyimpanan yang hemat: cache hasil pencocokan kini menyimpan indeks yang jauh lebih kecil daripada sebelumnya, sehingga daftar dengan jutaan item bisa ditampung dalam memori yang jauh lebih hemat — dan cache yang lebih kecil juga berarti lebih ramah untuk cache CPU itu sendiri, mempercepat iterasi pencarian berulang.
Bagi kalian, ini bukan sekadar angka: ini berarti jutaan item kini masuk akal untuk diproses di laptop tanpa membuat swap berbunyi.
Merangkum semuanya ke dalam resep yang bisa dijalankan, berikut strategi untuk dataset berukuran jutaan:
| Strategi | Kenapa | Cara |
|---|---|---|
| Filter di hulu | Kurangi baris yang masuk | Gunakan rg/fd, bukan find |
| Pertahankan urutan | Hindari biaya sorting | --no-sort pada input yang sudah terurut |
| Lewati scoring berat | Kurangi kerja matching | --exact bila kecocokan presisi sudah cukup |
| Batasi daftar | Jaga memori tetap wajar | --tail untuk aliran, head untuk awal daftar |
| Streaming, bukan menunggu | Tampil sebelum semua input tiba | Jangan cat file | fzf dengan file yang bisa dipipakan live |
| Normalisasi di hulu | Kurangi parsing di dalam fzf | Buang ANSI, kolom berlebih, dan baris kosong sebelum masuk |
Important
Satu perangkap yang sering menjatuhkan orang: fzf menampilkan antarmuka sebelum seluruh input selesai dibaca — itu memang dirancang begitu. Tetapi jika kalian memaksa sinkronisasi dengan --sync, fzf menunggu hingga input dan pencarian awal selesai sebelum menggambar. Pada daftar jutaan baris, --sync membuat layar tampak "beku" selama beberapa detik. Gunakan --sync hanya ketika aksi awal (seperti start) memang harus melihat daftar lengkap.
| Kesalahan | Gejala | Solusi |
|---|---|---|
| Mengirim jutaan baris tanpa filter | Lambat sejak pembacaan input | Filter di hulu dengan rg/fd |
--sort pada input yang sudah terurut | Biaya sorting tak berguna | --no-sort mempertahankan urutan input |
| Preview mahal tiap perpindahan kursor | Terasa lambat walau filter cepat | head/sed, bat --style=plain, batasi preview |
--sync pada daftar raksasa | Layar "beku" di awal | Lepas --sync; biarkan fzf streaming |
| ANSI berlebihan dalam item | Overhead parsing warna | Buang escape sequence di hulu |
Mengubah --algo tanpa ukur | Kualitas menurun tanpa keuntungan | Ukur dengan time dulu, baru putuskan |
Caution
Optimalisasi terbaik adalah yang berangkat dari pengukuran: time untuk pipeline, --no-sort --exact untuk uji cepat, dan observasi terhadap preview yang paling sering dipicu. Fzf 0.71 telah memindahkan banyak beban berat ke parallelisme dan cache yang hemat — tugas kalian bukan berlomba dengannya, melainkan tidak menghalangi jalannya.
Pada episode 17 ini kalian melengkapi sisi performa fzf: memilih algoritma dengan --algo (v2 default, v1 untuk kebutuhan khusus), membatasi item sebelum masuk dengan fd, head, dan --tail, memutuskan --sort versus --no-sort berdasarkan makna urutan input, serta meringankan beban preview dengan perintah murah dan gaya tanpa warna. Kalian juga memahami peningkatan fzf modern — pencarian yang scalable linear antar core CPU dan cache memori yang 86x lebih ringan sejak 0.71 — beserta strategi untuk menangani jutaan item secara streaming.
Pesan untuk dibawa pulang: kecepatan fzf adalah hasil kerja sama antara hulu yang hemat dan hilir yang efisien. Dataset yang dibatasi dengan baik masuk ke mesin yang dipercepat dengan baik — itulah resepnya.
Kini kalian punya bekal lengkap untuk memakai fzf dengan benar. Tetapi bahkan setup terbaik kadang tidak berjalan sesuai harapan — prompt aneh, hasil yang tidak muncul, preview yang diam. Di episode 18 kita membahas troubleshooting & debugging: menyalakan --debug, memahami log internal, dan mendiagnosis masalah yang paling sering muncul di lapangan.