Crate bzip2 Beralih dari C ke Rust 100%
(trifectatech.org)- Crate bzip2 menggantikan ketergantungan kode C dengan implementasi 100% Rust
- Performa secara keseluruhan meningkat dibanding sebelumnya, dan cross-compilation menjadi lebih mudah
- Implementasi Rust meningkatkan kecepatan kompresi dan dekompresi data dibanding versi C
- Masalah dependensi library seperti konflik simbol berkurang drastis
- Setelah melalui audit keamanan, bug logika penting diperbaiki dan stabilitasnya tervalidasi
Rilis bzip2 crate 0.6.0 dan peralihan ke basis Rust
- Hari ini bzip2 versi 0.6.0 telah dirilis
- Kini secara default menggunakan libbz2-rs-sys, implementasi algoritme bzip2 berbasis Rust yang dikembangkan sendiri
- Melalui peralihan ini, crate bzip2 menjadi lebih cepat dan cross-compilation menjadi lebih mudah
- Crate libbz2-rs-sys juga dapat dibangun dalam bentuk library dinamis C. Dengan ini, proyek C juga bisa memanfaatkan peningkatan performa
Mengapa peralihan ini dilakukan?
- Algoritme bzip2 dibuat pada tahun 90-an dan kini tidak lagi banyak digunakan secara luas, tetapi masih dibutuhkan di berbagai protokol dan library untuk kepatuhan spesifikasi
- Banyak proyek bergantung pada bzip2, bukan secara langsung, melainkan di suatu titik jauh di dalam pohon dependensi
- Berdasarkan pengalaman yang dibangun dari zlib-rs, kali ini implementasi bzip2 dimodernisasi
- Detail implementasi libbz2-rs-sys dibahas dalam posting blog sebelumnya. Di sini kita melihat manfaat dari peralihan ini
Peningkatan performa
- Implementasi Rust secara keseluruhan menunjukkan performa lebih tinggi daripada versi C
- Dalam beberapa situasi performanya setara, tetapi tidak ada kasus yang lebih lambat
- Performa kompresi: pada bzip2 ada opsi level, tetapi pengaruhnya terhadap performa kecil
- Hasil pengujian menunjukkan bahwa pada file sampel representatif, versi Rust mengalami peningkatan kecepatan lebih dari 10%
Kompresi:
| File | C(siklus eksekusi) | Rust(siklus eksekusi) | Perubahan relatif |
|---|---|---|---|
| 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% |
Pada dekompresi juga terlihat peningkatan performa di semua kasus:
| File | C(siklus eksekusi) | Rust(siklus eksekusi) | Perubahan relatif |
|---|---|---|---|
| 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% |
Namun, di lingkungan macOS kadang muncul perubahan angka dekompresi. Sulit dianalisis karena keterbatasan alat pengukuran performa
Dukungan cross-compilation
- Cross-compilation untuk proyek Rust yang memiliki dependensi C biasanya berjalan baik berkat crate
cc, tetapi jika gagal sangat sulit untuk di-debug - Dalam proses penautan system library, masalah tak terduga mudah muncul, dan pada beberapa lingkungan termasuk build WebAssembly hal ini menjadi hambatan nyata
- Dengan beralih ke implementasi Rust, masalah terkait C hilang sepenuhnya
- Kini cross-compilation dapat dilakukan di Windows, Android, WebAssembly, dan lainnya tanpa kendala khusus
- Ini merupakan keuntungan besar bukan hanya dari sisi pengalaman pengguna, tetapi juga dari sisi pemeliharaan
Secara default tidak ada konflik simbol (export)
- Pada dependensi C, simbol harus diekspor dari blok eksternal Rust, sehingga konflik dapat terjadi bila dependensi lain mengekspor simbol yang sama
- libbz2-rs-sys dirancang agar secara default tidak mengekspor simbol
- Karena itu, konflik simbol dengan library eksternal lain tidak akan terjadi. Jika diperlukan, ekspor dapat diaktifkan melalui feature flag
Menjalankan pengujian berbasis MIRI
- Untuk mengimplementasikan bzip2 dengan performa tinggi di Rust, penggunaan kode unsafe tidak dapat dihindari, dan banyak kode unsafe juga diperlukan untuk mereplikasi antarmuka C
- Untungnya, kode ini dapat dijalankan dan diuji di lingkungan MIRI
- Lebih jauh lagi, library atau aplikasi level atas yang menggunakan bzip2 kini juga dapat menjalankan pengujian MIRI
Kesimpulan
Sekarang crate bzip2 menjadi lebih cepat. Ia memberikan pengalaman yang lebih baik secara alami, sampai-sampai Anda tak perlu lagi memikirkannya
1 komentar
Komentar Hacker News