bzip2 Crate, C'den %100 Rust'a geçti
(trifectatech.org)- bzip2 crate'i, C kodu bağımlılığını %100 Rust bir uygulamayla değiştirdi
- Performans genel olarak önceki sürüme göre arttı ve cross-compilation daha kolay hale geldi
- Rust uygulaması, C sürümüne kıyasla hem veri sıkıştırma hem de açma hızında iyileşme sağlıyor
- Sembol çakışması gibi kütüphane bağımlılığı sorunları büyük ölçüde azaldı
- Güvenlik denetiminden geçirilerek önemli mantık hataları düzeltildi ve kararlılığı doğrulandı
bzip2 crate 0.6.0 yayımlandı ve Rust tabanına geçti
- Bugün bzip2 sürüm 0.6.0 yayımlandı
- Artık varsayılan olarak kendi geliştirdikleri Rust tabanlı bzip2 algoritması uygulaması libbz2-rs-sys kullanılıyor
- Bu geçiş sayesinde bzip2 crate'i daha hızlı oldu ve cross-compilation kolaylaştı
- libbz2-rs-sys crate'i C dinamik kütüphanesi olarak da derlenebiliyor. Böylece C projeleri de performans artışından yararlanabiliyor
Bu geçiş neden yapıldı?
- bzip2 algoritması 90'larda geliştirildi; bugün yaygın kullanımda olmasa da çeşitli protokoller ve kütüphanelerde hâlâ spesifikasyona uyumluluk için gerekiyor
- Birçok proje doğrudan olmasa da bağımlılık ağacının derinliklerinde bzip2'ye bağlı
- Ekip, zlib-rs'de edindiği deneyimi temel alarak bu kez bzip2 uygulamasını modernleştirdi
- libbz2-rs-sys uygulamasının ayrıntıları önceki bir blog yazısında ele alınmıştı. Burada ise bu geçişin faydalarına bakılıyor
Artan performans
- Rust uygulaması genel olarak C sürümünden daha yüksek performans gösteriyor
- Bazı durumlarda eşdeğer performans sunsa da daha yavaş olduğu bir durum yok
- Sıkıştırma performansı: bzip2'de level seçeneği var ancak performansa etkisi sınırlı
- Test sonuçlarında, temsili örnek dosyalarda Rust sürümü %10'dan fazla hız artışı sağladı
Sıkıştırma:
| Dosya | C(yürütme çevrimi) | Rust(yürütme çevrimi) | Göreli değişim |
|---|---|---|---|
| sample3.ref (level 1) | 38.51M | 33.53M | -14.87% |
| silesia-small.tar (level 1) | 3.43G | 3.00G | -14.30% |
| silesia-small.tar (level 9) | 3.47G | 3.17G | -9.66% |
Açma işlemlerinde de tüm durumlarda performans iyileşti:
| Dosya | C(yürütme çevrimi) | Rust(yürütme çevrimi) | Göreli değişim |
|---|---|---|---|
| sample3.bz2 | 2.53M | 2.42M | -4.48% |
| sample1.bz2 | 9.63M | 8.86M | -8.63% |
| sample2.bz2 | 20.47M | 19.02M | -7.67% |
| dancing-color.ps.bz2 | 87.46M | 83.16M | -5.17% |
| re2-exhaustive.txt.bz2 | 1.89G | 1.76G | -7.65% |
| zip64support.tar.bz2 | 2.32G | 2.11G | -10.00% |
Bununla birlikte, macOS ortamında zaman zaman açma ölçümlerinde değişiklikler görüldü. Performans ölçüm araçlarının sınırlamaları nedeniyle analiz zordu
Cross-compilation desteği
- C bağımlılığı olan Rust projelerinde cross-compilation genelde
cccrate'i sayesinde çalışsa da başarısız olduğunda hata ayıklamak çok zor oluyor - Sistem kütüphanesi bağlama sürecinde beklenmedik sorunlar çıkabiliyor ve özellikle WebAssembly derlemeleri gibi bazı ortamlarda bu pratikte ciddi bir engel oluşturuyor
- Rust uygulamasına geçilmesiyle C ile ilgili sorunlar tamamen ortadan kalktı
- Artık Windows, Android, WebAssembly gibi ortamlarda da özel bir durum olmadan cross-compilation yapılabiliyor
- Bu, yalnızca kullanıcı deneyimi açısından değil bakım açısından da büyük bir avantaj
Varsayılan olarak sembol (export) çakışması yok
- C bağımlılığı olduğunda sembollerin Rust dış bloklarından export edilmesi gerekiyor; başka bir bağımlılık aynı sembolleri export ederse çakışma oluşuyor
- libbz2-rs-sys, varsayılan olarak sembol export etmeyecek şekilde tasarlandı
- Bu nedenle diğer harici kütüphanelerle sembol çakışması yaşanmıyor. Gerekirse bir feature flag ile export etkinleştirilebiliyor
MIRI tabanlı testler çalıştırma
- Rust'ta bzip2'yi yüksek performansla uygulamak için unsafe kod kullanımı kaçınılmaz ve C arayüzünü taklit etmek için de çok sayıda unsafe kod gerekiyor
- Neyse ki bu kod MIRI ortamında çalıştırılıp test edilebiliyor
- Dahası, bzip2 kullanan üst seviye kütüphane ve uygulamalar da artık MIRI testlerinden geçirilebiliyor
Sonuç
Artık bzip2 crate'i daha hızlı. Üzerinde düşünmeyi bile gerektirmeden, doğal şekilde daha iyi bir deneyim sunuyor
1 yorum
Hacker News yorumu
cargo-cyapılandırmasının zaten bulunduğu ve bunun olumlu göründüğü, ancak namespace farklı olduğu için C programlarında mevcutlibbz2olarak otomatik algılanmayacağı belirtiliyor. bzip2 sembollerine aşina olunmadığından tam ABI uyumluluğu konusunda kesin konuşmanın zor olduğu da ekleniyor. GNU işletim sistemi uygulamasını doğrudan sürdürmenin çok zaman aldığı, fakat vakit olduğunda deneysel proje platypos için PR’ların memnuniyetle karşılanacağı söyleniyorbounds misssorunlarının karşılaştırılmasının ilginç olduğu söyleniyor. Bu türbounds missaçıklarının gerçekten kod çalıştırmaya kadar gidip gidemeyeceği merak ediliyorclz,popcnt,clmul,pdepvb.) temiz bir şekilde yararlanmayı sağlayacak özelliklerden yoksun kaldığı eleştiriliyor. Bu tür soyut komut desteğinin bile bu tarz kodların optimizasyonuna büyük katkı sağladığı belirtiliyorperfprofiler olmasa dadtraceile performans analizinin yeterince yapılabildiği düşünülüyor. Perl ile yazılmış özgün flame graph betiğinin dedtracekullandığı, Rust ile yeniden yazılan flame graph’ın da aynı yöntemi izlediği belirtiliyor.cache missya damicro instruction retiredgibi bazı metrikler eksik olsa da hâlâ çok kullanışlı olduğu söyleniyorlbzip2gibi paralel decompression desteği olup olmadığı soruluyor. Ya da block magic ön taraması gibi yöntemlerle paralel işleme imkânı bulunup bulunmadığı merak ediliyor. Edit olarak “muhtemelen desteklemiyor” sonucuna varılıyorLbzip2’nin tüm CPU çekirdeklerini kullanarak çok hızlı decompression sağladığına dair deneyim paylaşılıyor. Yıl 2025 olmuşken Python gibi birçok büyük programın hâlâ yalnızca tek çekirdek kullanmasının üzücü olduğu söyleniyor