4 puan yazan GN⁺ 2025-03-17 | 1 yorum | WhatsApp'ta paylaş
  • zlib-rs, veri sıkıştırma için Rust tabanlı bir zlib uygulaması; kısa süre önce 0.4.2 sürümü yayımlandı ve performansta büyük iyileştirmeler getirdi
  • Şu anda API uyumlu en hızlı zlib uygulaması ve özellikle açma performansında rakiplerinden daha iyi
  • Başlıca performans iyileştirmeleri: çalışma zamanında en uygun SIMD uygulamasını otomatik seçme, DFA optimizasyonu vb.

Çoklu sürümleme (Multiversioning)

  • Çalışma zamanında CPU'ya göre en hızlı işlev sürümü otomatik seçiliyor
  • Rust'ta varsayılan olarak çoklu sürümleme desteği olmadığı için bunun elle uygulanması gerekiyor
  • Kodun çalışma zamanı ek yükünü en aza indirirken en iyi performansı sağlıyor

DFA optimizasyonu (Deterministic Finite Automata)

  • C dili, switch deyimlerinde örtük fallthrough kullanarak performansı artırıyor
  • Rust'ta buna benzer bir mekanizma olmadığından performans düşüşü oluşuyor
  • LLVM'nin -Cllvm-args=-enable-dfa-jump-thread seçeneği uygulandı → performans geri kazanıldı
  • LLVM'nin varsayılan ayarlarında yer almıyor, ancak gelecekte Rustc'de varsayılan olarak etkinleştirilmesi planlanıyor

Benchmark performans karşılaştırması

1. zlib-ng ile performans karşılaştırması

  • zlib-rs, çoğu girdi boyutunda zlib-ng'den daha hızlı performans gösteriyor
  • Özellikle 1KB girdide yaklaşık %10 daha hızlı, 65KB girdide ise yaklaşık %6 daha hızlı
  • En küçük girdi boyutlarında biraz geride kalsa da genel olarak performans üstünlüğü var

Örneğin:

  • Girdi boyutu 4 bayt olduğunda zlib-ng biraz daha hızlı, ancak gerçek kullanımda etkisi sınırlı
  • Girdi boyutu 1KB olduğunda zlib-rs yaklaşık %10 daha hızlı
  • Girdi boyutu 65KB olduğunda zlib-rs yaklaşık %6 daha hızlı

→ Büyük chunk'larda zlib-ng'ye karşı belirgin performans üstünlüğü

2. zlib-chromium ile performans karşılaştırması

  • Küçük chunk'larda zlib-chromium daha hızlı
  • Ancak büyük chunk'larda zlib-rs üstün
  • Genel kullanım boyutlarındaki girdilerde zlib-rs daha iyi performans sunuyor

Örneğin:

  • Girdi boyutu 4 bayt olduğunda zlib-chromium yaklaşık %12 daha hızlı
  • Girdi boyutu 16 bayt olduğunda zlib-chromium yaklaşık %6 daha hızlı
  • Girdi boyutu 1KB ve üzeri olduğunda zlib-rs performans avantajına sahip

→ Genel kullanım boyutlarında zlib-rs performans üstünlüğü

Sıkıştırma performansı karşılaştırması

  • Sıkıştırma performansında iyileştirmeler sürüyor, ancak sonuçlar karışık
  • Varsayılan sıkıştırma seviyesi (6) için %6 iyileşme, en yüksek sıkıştırma seviyesi (9) için %13 performans artışı
  • Diğer sıkıştırma seviyelerinde ise hâlâ zlib-ng daha hızlı

Örneğin:

  • Sıkıştırma seviyesi 6'da zlib-rs, zlib-ng'den yaklaşık %6 daha hızlı
  • Sıkıştırma seviyesi 9'da zlib-rs, zlib-ng'den yaklaşık %13 daha hızlı
  • Ancak sıkıştırma seviyeleri 1~4 arasında zlib-ng üstün

Sonuç

  • zlib-rs, açma performansında zlib-ng ve zlib-chromium'a karşı üstünlük sağlıyor
  • Sıkıştırma performansı hâlâ geliştiriliyor ve başlıca sıkıştırma seviyelerinde anlamlı iyileşmeler gösteriyor
  • Hem Rust hem de C projelerinde kullanılabilir
    • Rust → flate2 crate'inde zlib-rs bayrağını kullanın
    • C → dinamik kütüphane olarak derlenip kullanılabilir

1 yorum

 
GN⁺ 2025-03-17
Hacker News görüşü
  • Rust'ı zaten bildiğini fark etmiş

    • Rust'ın amacının güvenlik olduğunu düşünmüştüm ama bu kütüphanede unsafe anahtar sözcüğü yoğun biçimde kullanılıyor
    • C ile Rust arasındaki farkın anlamsız hale geldiği noktanın ne zaman olduğunu merak ediyorum
    • Inline assembly kullanılırsa her iki dil de aynı makine kodunu üretebilir
    • Rust derleyicisinin C derleyicisinden daha iyi optimizasyon yapıp yapmadığını merak ediyorum
  • "C'den daha hızlı" ifadesi, sonunda farklı tasarım, uygulama, algoritma vb. anlamına geliyor

    • Zaten var olan bir uygulamadan daha hızlı olabilir ama "C'den daha hızlı" iddiası tuhaf
  • Nim'deki zippy'nin zlib'den 1,5 ila 2 kat daha hızlı olduğunu iddia ediyor

    • C'de standart kurulumdan daha hızlı zlib uygulamaları da var
    • zlib bugünlerde eski sayılıyor ama hâlâ popüler
    • Yeni, paralellik dostu formatların temeli olarak kullanılıyor
  • Rust'ın performansının Rust'ın kendisiyle mi ilgili olduğunu, yoksa diğer C sürümlerine göre daha iyi optimize edilmiş olmasından mı kaynaklandığını merak ediyorum

    • C++'ın C'den consistently daha iyi performans gösterdiği sıralama türleri var
    • Rust ile C arasında da buna benzer bir durum olup olmadığını merak ediyorum
  • Chromium, standartta yer alan algoritmalar nedeniyle zlib kullanıyor

    • Daha iyi bir algoritma seçilirse daha iyi performans elde edilebilir
    • Zstandard daha hızlı ve daha iyi sıkıştırıyor
    • LZ4 çok daha hızlı ama boyutu daha küçük olmuyor
  • Zstandard ve blake3 digest'e izin veriliyor

  • Rust'ın C kadar hızlı olduğunu söylemek daha doğru olur

    • Bu yine de büyük bir başarı
  • Hangi kütüphanenin daha hızlı derlendiği

    • Hangisinin daha az bağımlılığa sahip olduğu
    • Her kütüphanenin boyutunun aynı olup olmadığı, hangisinin daha küçük olduğu
  • Rust kullanıcıları Rust ile C'yi karşılaştırmayı seviyor ama C kullanıcıları C ile Rust'ı karşılaştırmayı nadiren yapıyor

  • Derlenen sistem dilleri söz konusu olduğunda dilin hıza etkisi neredeyse yoktur

    • Optimize edilmiş sürümler allocation'ı kontrol eder, iyi bellek erişim kalıpları kullanır ve SIMD ile multithreading kullanarak kolayca 100 kattan fazla hızlanabilir
    • Yalnızca daha iyi bellek erişimi bile programı 20 kattan fazla hızlandırabilir
  • Kastedilen şey, uygulamanın C'dekinden daha hızlı olduğudur

    • "C'den daha hızlı" diye bir şey yok