Crate bzip2 chuyển từ C sang Rust 100%
(trifectatech.org)- Crate bzip2 đã thay thế phụ thuộc mã C bằng triển khai Rust 100%
- Hiệu năng nhìn chung được cải thiện so với trước đây, đồng thời việc cross-compile cũng trở nên dễ dàng hơn
- Triển khai Rust cải thiện cả tốc độ nén lẫn giải nén dữ liệu so với phiên bản C
- Các vấn đề phụ thuộc thư viện như xung đột symbol được giảm đi đáng kể
- Sau khi trải qua kiểm toán bảo mật, các lỗi logic nghiêm trọng đã được sửa và độ ổn định đã được xác minh
Phát hành bzip2 crate 0.6.0 và chuyển sang nền tảng Rust
- Hôm nay bzip2 phiên bản 0.6.0 đã được phát hành
- Từ nay, mặc định nó sử dụng libbz2-rs-sys, một triển khai thuật toán bzip2 dựa trên Rust do nhóm tự phát triển
- Với sự chuyển đổi này, bzip2 crate đã nhanh hơn và việc cross-compile cũng dễ hơn
- Crate libbz2-rs-sys cũng có thể được build dưới dạng thư viện động C. Nhờ đó, các dự án C cũng có thể tận dụng các cải thiện về hiệu năng
Vì sao có sự chuyển đổi này?
- Thuật toán bzip2 được tạo ra từ thập niên 90, hiện nay không còn được dùng rộng rãi, nhưng vẫn cần thiết trong nhiều giao thức và thư viện để tuân thủ đặc tả
- Nhiều dự án không phụ thuộc trực tiếp, nhưng lại phụ thuộc vào bzip2 ở đâu đó sâu trong cây phụ thuộc
- Dựa trên kinh nghiệm tích lũy từ zlib-rs, lần này chúng tôi đã hiện đại hóa triển khai bzip2
- Các chi tiết triển khai của crate libbz2-rs-sys đã được đề cập trong bài blog trước. Ở đây sẽ tập trung vào các lợi ích của lần chuyển đổi này
Hiệu năng được cải thiện
- Triển khai Rust nhìn chung cho hiệu năng cao hơn phiên bản C
- Trong một số trường hợp hiệu năng tương đương, nhưng không có trường hợp nào chậm hơn
- Hiệu năng nén: trong bzip2 có tùy chọn level, nhưng ảnh hưởng đến hiệu năng là không đáng kể
- Kết quả thử nghiệm cho thấy trên các tệp mẫu tiêu biểu, phiên bản Rust nhanh hơn hơn 10%
Nén:
| Tệp | C (chu kỳ thực thi) | Rust (chu kỳ thực thi) | Thay đổi tương đối |
|---|---|---|---|
| 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% |
Ở tác vụ giải nén cũng cho thấy hiệu năng được cải thiện trong mọi trường hợp:
| Tệp | C (chu kỳ thực thi) | Rust (chu kỳ thực thi) | Thay đổi tương đối |
|---|---|---|---|
| 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% |
Tuy nhiên, trên môi trường macOS đôi khi có biến động ở số liệu giải nén. Do giới hạn của công cụ đo hiệu năng nên khó phân tích nguyên nhân
Hỗ trợ cross-compile
- Việc cross-compile các dự án Rust có phụ thuộc C thường hoạt động ổn nhờ crate
cc, nhưng khi thất bại thì việc debug cực kỳ khó khăn - Trong quá trình link thư viện hệ thống rất dễ phát sinh các vấn đề ngoài dự kiến, và ở một số môi trường như build WebAssembly thì đây trở thành trở ngại thực sự
- Việc chuyển sang triển khai Rust khiến các vấn đề liên quan đến C biến mất hoàn toàn
- Giờ đây có thể cross-compile sang Windows, Android, WebAssembly và các nền tảng khác mà không có điểm gì đặc biệt cần lưu ý
- Đây là ưu điểm lớn không chỉ về trải nghiệm người dùng mà còn ở góc độ bảo trì
Mặc định không còn xung đột symbol (export)
- Với phụ thuộc C, cần export symbol trong các khối extern của Rust, nên nếu phụ thuộc khác cũng export cùng symbol thì sẽ xảy ra xung đột
- libbz2-rs-sys được thiết kế để mặc định không export symbol
- Vì vậy sẽ không xảy ra xung đột symbol với các thư viện bên ngoài khác. Nếu cần thì cũng có thể bật export bằng feature flag
Chạy kiểm thử dựa trên MIRI
- Để triển khai bzip2 hiệu năng cao trong Rust, việc dùng unsafe code là không thể tránh khỏi, và việc tái tạo giao diện C cũng cần nhiều unsafe code
- May mắn là có thể chạy và kiểm thử đoạn mã này trong môi trường MIRI
- Hơn nữa, các thư viện hoặc ứng dụng cấp cao hơn sử dụng bzip2 giờ đây cũng có thể chạy kiểm thử bằng MIRI
Kết luận
Giờ đây bzip2 crate đã nhanh hơn. Nó mang lại trải nghiệm tốt hơn một cách tự nhiên đến mức gần như bạn không còn phải bận tâm về nó nữa
1 bình luận
Ý kiến trên Hacker News