- Jika membangun sendiri paket source code
jq yang disediakan Ubuntu, performanya bisa meningkat hingga 90%
- Performa dimaksimalkan dengan meningkatkan compiler, flag optimasi, dan allocator memori
Pengaturan
jq digunakan untuk memproses file GeoJSON berformat JSON
- Menjalankan kueri yang menampilkan nama kota dari semua parcel yang bernilai di atas ambang tertentu pada parcel map Alameda County Assessor berukuran 500MB
- Pada sistem Ryzen 9 9950X, dibutuhkan sekitar 5 detik untuk file yang sudah tercache, sehingga dicoba untuk ditingkatkan
Langkah 1: Membangun ulang paket
- Mengunduh source code
jq dari Launchpad lalu membangunnya ulang tanpa flag apa pun
- Hasil: peningkatan performa 2~4%
- Hasil benchmark
jq hasil build: rata-rata 4.517 detik
- Paket bawaan Ubuntu: rata-rata 4.641 detik
- Peningkatan performa: 1,03x lebih cepat
Langkah 2: Menggunakan Clang dan flag optimasi tingkat lanjut
- Dikompilasi dengan Clang-18 dan menggunakan level optimasi serta LTO
- Flag utama yang digunakan:
-O3 → meningkatkan level optimasi
-flto → menerapkan Link-Time Optimization
-DNDEBUG → mengecualikan kode debug
- Hasil benchmark
jq hasil build: rata-rata 3.853 detik
- Paket bawaan Ubuntu: rata-rata 4.631 detik
- Peningkatan performa: 1,20x lebih cepat
Langkah 3: Menambahkan TCMalloc
- Menggunakan TCMalloc alih-alih malloc bawaan GNU libc
- Membangun dengan menambahkan
-L/usr/lib/x86_64-linux-gnu -ltcmalloc_minimal
- Hasil benchmark
jq hasil build: rata-rata 3.253 detik
- Paket bawaan Ubuntu: rata-rata 4.611 detik
- Peningkatan performa: 1,42x lebih cepat
Langkah 4: Menerapkan preload dinamis TCMalloc
- Pada paket bawaan Ubuntu, TCMalloc digunakan melalui preload dinamis
- Hasil benchmark
jq bawaan: rata-rata 4.601 detik
jq dengan TCMalloc: rata-rata 4.082 detik
- Peningkatan performa: 1,13x lebih cepat
Langkah 5: Menguji preload dinamis allocator lain
- Menguji allocator memori lain yang disediakan Ubuntu, yaitu jemalloc dan mimalloc
- mimalloc memberikan performa terbaik
- Hasil benchmark
jq bawaan: rata-rata 4.123 detik
jq dengan TCMalloc: rata-rata 4.130 detik
jq dengan Jemalloc: rata-rata 3.510 detik
jq dengan Mimalloc: rata-rata 3.154 detik → performa meningkat 1,31x
Langkah 6: Build langsung dengan mimalloc
- Menautkan mimalloc secara statis, bukan lewat preload dinamis
- Performa dimaksimalkan
- Hasil benchmark
jq hasil build: rata-rata 2.428 detik
- Paket bawaan Ubuntu: rata-rata 4.606 detik
- Peningkatan performa: 1,90x lebih cepat
🚀 Hasil akhir
jq hasil build sendiri 90% lebih cepat daripada paket Ubuntu
- Performa pemrosesan 13.000 file JSON berukuran total 2,2GB:
jq hasil build: 0.755 detik
jq bawaan: 1.424 detik
- Peningkatan performa: sekitar 2x
1 komentar
Komentar Hacker News
Judul "Membuat Ubuntu 90% lebih cepat dengan membangun ulang paket dan mengganti allocator memori" terdengar seperti clickbait
Rekayasa adalah seni berkompromi
Gentoo Linux adalah sistem operasi yang dirancang agar bisa dioptimalkan sesuai kebutuhan spesifik pengguna
Jika memasang paket seperti jq secara manual, Anda bisa tidak lagi menerima pembaruan keamanan
Menggunakan malloc tidak resmi bisa menimbulkan bug aneh
Setelah membaca bahwa perubahan sederhana bisa memberi peningkatan kecepatan besar, ingin memberi tahu pengembang jq
Mengompilasi paket dari source atau mengunduh biner resmi bisa bermanfaat
Fitur "cargo install" di Rust berguna karena memungkinkan optimasi untuk platform tertentu
Setelah mengganti allocator memori, Ubuntu bisa dibuat 90% lebih cepat dengan membangun ulang paket