- Ubuntu’nun sunduğu
jq kaynak kod paketini doğrudan derlemek, performansı %90’a kadar artırabiliyor
- Derleyici, optimizasyon bayrakları ve bellek ayırıcı iyileştirilerek performans en üst düzeye çıkarılıyor
Kurulum
jq, JSON biçimindeki GeoJSON dosyalarını işlemek için kullanılıyor
- 500MB büyüklüğündeki Alameda County Assessor’s parcel map üzerinde, belirli bir değerin üzerindeki tüm parsellerin şehir adını yazdıran bir sorgu çalıştırılıyor
- Ryzen 9 9950X sisteminde, önbelleğe alınmış dosya üzerinden yaklaşık 5 saniye sürmesi nedeniyle bunun iyileştirilmesine karar veriliyor
1. adım: Paketi yeniden derlemek
- Launchpad’den
jq kaynak kodu indirildikten sonra hiçbir bayrak kullanılmadan yeniden derleniyor
- Sonuç: %2~4 performans artışı
- Benchmark sonuçları
- Derlenen jq: ortalama 4.517 saniye
- Ubuntu varsayılan paketi: ortalama 4.641 saniye
- Performans artışı: 1,03 kat daha hızlı
2. adım: Clang ve gelişmiş optimizasyon bayraklarını kullanmak
- Clang-18 ile derlenip optimizasyon seviyesi ve LTO kullanılıyor
- Kullanılan başlıca bayraklar:
-O3 → optimizasyon seviyesini yükseltir
-flto → Link-Time Optimization uygular
-DNDEBUG → debug kodunu hariç tutar
- Benchmark sonuçları
- Derlenen jq: ortalama 3.853 saniye
- Ubuntu varsayılan paketi: ortalama 4.631 saniye
- Performans artışı: 1,20 kat daha hızlı
3. adım: TCMalloc eklemek
- GNU libc’nin varsayılan malloc’u yerine TCMalloc kullanılıyor
-L/usr/lib/x86_64-linux-gnu -ltcmalloc_minimal eklendikten sonra derleniyor
- Benchmark sonuçları
- Derlenen jq: ortalama 3.253 saniye
- Ubuntu varsayılan paketi: ortalama 4.611 saniye
- Performans artışı: 1,42 kat daha hızlı
4. adım: TCMalloc için dinamik preload uygulamak
- Ubuntu varsayılan paketinde dinamik preload ile TCMalloc kullanılıyor
- Benchmark sonuçları
- Varsayılan jq: ortalama 4.601 saniye
- TCMalloc uygulanmış jq: ortalama 4.082 saniye
- Performans artışı: 1,13 kat daha hızlı
5. adım: Diğer ayırıcılar için dinamik preload testi
- Ubuntu’nun sunduğu diğer bellek ayırıcıları jemalloc ve mimalloc test ediliyor
- En iyi performansı mimalloc veriyor
- Benchmark sonuçları
- Varsayılan jq: ortalama 4.123 saniye
- TCMalloc uygulanmış jq: ortalama 4.130 saniye
- Jemalloc uygulanmış jq: ortalama 3.510 saniye
- Mimalloc uygulanmış jq: ortalama 3.154 saniye → performans 1,31 kat arttı
6. adım: mimalloc ile doğrudan derlemek
- mimalloc, dinamik preload yerine statik olarak linkleniyor
- Performans en üst düzeye çıkarılıyor
- Benchmark sonuçları
- Derlenen jq: ortalama 2.428 saniye
- Ubuntu varsayılan paketi: ortalama 4.606 saniye
- Performans artışı: 1,90 kat daha hızlı
🚀 Nihai sonuç
- Doğrudan derlenen jq, Ubuntu paketinden %90 daha hızlı
- 2,2GB JSON dosyası 13.000 adet işlendiğinde performans:
- Derlenen jq: 0.755 saniye
- Varsayılan jq: 1.424 saniye
- Performans artışı: yaklaşık 2 kat
1 yorum
Hacker News görüşleri
"Ubuntu paketlerini yeniden derleyip bellek ayırıcısını değiştirerek %90 daha hızlı hale getirmek" başlığı clickbait gibi duruyor
mallocuygulamasını değiştirmek içinjemallocönceden yüklenmiş olarak kullanılmış ve bellek kullanımını dengelemede olumlu sonuçlar alınmışMühendislik, ödünleşim sanatıdır
Gentoo Linux, kullanıcının özel kullanım amacına göre optimize edilebilmesi için tasarlanmış bir işletim sistemidir
jqgibi paketleri elle kurmak, güvenlik güncellemelerinin dışında kalmaya yol açabilironiguramaiçin bir güvenlik güncellemesi çıkmıştı; benzer bir durum tekrar yaşanırsa sistem savunmasız kalabilirCVE-2017-9224dahil çeşitli güvenlik açıklarının düzeltildiği örnekler bulunuyorResmî olmayan bir
mallockullanmak tuhaf hatalara yol açabilirBasit bir değişiklikle büyük hız artışı elde edilebildiğini okuyunca bunu
jqgeliştiricisine bildirmek isteniyorPaketleri kaynaktan derlemek veya resmî ikilileri indirmek faydalı olabilir
Rust'ın
cargo installözelliği, belirli bir platform için optimizasyon yapılabilmesini sağladığı için kullanışlıdırjaqveyq,jqkullanılırken performans artışı için sık kullanılan seçeneklerdirBellek ayırıcısı değiştirildikten sonra Ubuntu paketi yeniden derlenerek %90 daha hızlı hale getirilebilir