bzip2 Crate अब C से 100% Rust में बदल गया
(trifectatech.org)- bzip2 crate ने C code dependency को 100% Rust implementation से बदल दिया है
- performance पहले की तुलना में कुल मिलाकर बेहतर हुई है, और cross-compilation भी आसान हो गया है
- Rust implementation में C version की तुलना में data compression और decompression, दोनों की speed बेहतर हुई है
- symbol collision जैसी library dependency समस्याएँ काफी कम हो गई हैं
- security audit के बाद महत्वपूर्ण logic bug ठीक किए गए, और stability की पुष्टि हुई है
bzip2 crate 0.6.0 रिलीज़ और Rust-आधारित बदलाव
- आज bzip2 version 0.6.0 जारी किया गया
- अब यह डिफ़ॉल्ट रूप से स्वयं विकसित Rust-आधारित bzip2 algorithm implementation libbz2-rs-sys का उपयोग करता है
- इस बदलाव से bzip2 crate और तेज़ हो गया है, और cross-compilation आसान हुई है
- libbz2-rs-sys crate को C dynamic library के रूप में भी build किया जा सकता है। इससे C projects भी performance improvement का लाभ उठा सकते हैं
यह बदलाव क्यों किया गया?
- bzip2 algorithm 90 के दशक में बना था और आज बहुत व्यापक रूप से उपयोग नहीं होता, लेकिन कई protocols और libraries में अब भी spec compliance के लिए इसकी ज़रूरत होती है
- कई projects सीधे नहीं, लेकिन dependency tree की किसी गहराई में bzip2 पर निर्भर हैं
- हमने zlib-rs से मिले अनुभव के आधार पर इस बार bzip2 implementation को modernize किया है
- libbz2-rs-sys के implementation details पर पिछली blog post में चर्चा की गई थी। यहाँ हम इस बदलाव के फायदों को देखते हैं
बेहतर performance
- Rust implementation कुल मिलाकर C version से बेहतर performance दिखाती है
- कुछ परिस्थितियों में performance समान है, लेकिन कहीं भी यह धीमी नहीं है
- compression performance: bzip2 में level option होता है, लेकिन performance पर उसका असर बहुत कम है
- test results में representative sample files पर Rust version ने 10% से अधिक speed improvement दिखाया
compression:
| फ़ाइल | C(साइकिल) | Rust(साइकिल) | सापेक्ष बदलाव |
|---|---|---|---|
| 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% |
decompression में भी हर मामले में performance बेहतर रही:
| फ़ाइल | C(साइकिल) | Rust(साइकिल) | सापेक्ष बदलाव |
|---|---|---|---|
| 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% |
हालाँकि, macOS वातावरण में कभी-कभी decompression के आँकड़ों में बदलाव दिखता है। performance measurement tool की सीमाओं के कारण इसका विश्लेषण कठिन था
cross-compilation support
- C dependency वाले Rust projects में cross-compilation आमतौर पर
cccrate की वजह से काम कर जाती है, लेकिन असफल होने पर debugging बहुत कठिन हो जाती है - system library linking के दौरान अप्रत्याशित समस्याएँ आ सकती हैं, और WebAssembly build सहित कुछ environments में यह वास्तविक बाधा बन जाता है
- Rust implementation में बदलने से C-संबंधित समस्याएँ पूरी तरह समाप्त हो गईं
- अब Windows, Android, WebAssembly आदि में भी बिना किसी विशेष समस्या के cross-compilation संभव है
- यह सिर्फ user experience ही नहीं, maintenance के नज़रिए से भी बड़ा फायदा है
डिफ़ॉल्ट रूप से symbol(export) collision नहीं
- C dependency के मामले में Rust external block से symbols export करने पड़ते हैं, इसलिए अगर कोई दूसरी dependency वही symbol export करे तो collision हो सकती है
- libbz2-rs-sys को डिफ़ॉल्ट रूप से symbols export न करने के लिए design किया गया है
- इसलिए दूसरी external libraries के साथ symbol collision होने की संभावना नहीं रहती। ज़रूरत हो तो feature flag से export को सक्षम किया जा सकता है
MIRI-आधारित test execution
- Rust में bzip2 को high-performance तरीके से implement करने के लिए unsafe code का उपयोग अपरिहार्य है, और C interface को दोहराने के लिए भी काफी unsafe code चाहिए
- अच्छी बात यह है कि इस code को MIRI environment में चलाकर test किया जा सकता है
- इससे आगे बढ़कर, bzip2 का उपयोग करने वाली higher-level libraries या applications भी अब MIRI testing कर सकती हैं
निष्कर्ष
अब bzip2 crate और तेज़ हो गया है। इतना कि अब इस पर अलग से ध्यान देने की ज़रूरत भी नहीं पड़ती, और स्वाभाविक रूप से बेहतर अनुभव मिलता है
1 टिप्पणियां
Hacker News टिप्पणियाँ