Die bzip2-Crate stellt von C vollständig auf Rust um
(trifectatech.org)- Die bzip2-Crate ersetzt ihre C-Code-Abhängigkeit vollständig durch eine 100%ige Rust-Implementierung
- Die Leistung verbessert sich insgesamt gegenüber bisher, und Cross-Compilation wird einfacher
- Die Rust-Implementierung verbessert sowohl die Datenkompression als auch die Dekompressionsgeschwindigkeit gegenüber der C-Version
- Probleme mit Bibliotheksabhängigkeiten wie Symbolkonflikte werden deutlich reduziert
- Nach einem Sicherheitsaudit wurden wichtige Logikfehler behoben und die Stabilität verifiziert
Veröffentlichung von bzip2 Crate 0.6.0 und Umstellung auf Rust-Basis
- Heute wurde bzip2 Version 0.6.0 veröffentlicht
- Standardmäßig wird nun die eigens entwickelte Rust-basierte Implementierung des bzip2-Algorithmus libbz2-rs-sys verwendet
- Durch diese Umstellung wird die bzip2-Crate schneller, und Cross-Compilation wird einfacher
- Die Crate libbz2-rs-sys kann auch als C-Dynamic-Library gebaut werden. Dadurch können auch C-Projekte von den Leistungsverbesserungen profitieren
Warum wurde diese Umstellung vorgenommen?
- Der bzip2-Algorithmus wurde in den 90er-Jahren entwickelt und wird heute nicht mehr besonders häufig verwendet, ist aber in verschiedenen Protokollen und Bibliotheken weiterhin für Spezifikationskonformität nötig
- Viele Projekte hängen nicht direkt, aber irgendwo tief im Abhängigkeitsbaum, von bzip2 ab
- Auf Basis der Erfahrungen aus zlib-rs wurde diesmal die bzip2-Implementierung modernisiert
- Details zur Implementierung von libbz2-rs-sys wurden in einem früheren Blogbeitrag behandelt. Hier geht es um die Vorteile dieser Umstellung
Verbesserte Leistung
- Die Rust-Implementierung zeigt insgesamt eine höhere Leistung als die C-Version
- In manchen Situationen ist die Leistung gleichwertig, aber es gibt keine Fälle, in denen sie langsamer ist
- Kompressionsleistung: bzip2 bietet zwar eine Level-Option, deren Einfluss auf die Leistung ist jedoch gering
- In Tests zeigte die Rust-Version bei repräsentativen Beispieldateien eine Geschwindigkeitssteigerung von mehr als 10%
Kompression:
| Datei | C(Ausführungszyklen) | Rust(Ausführungszyklen) | Relative Veränderung |
|---|---|---|---|
| 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% |
Auch bei der Dekompression wurde in allen Fällen eine verbesserte Leistung erzielt:
| Datei | C(Ausführungszyklen) | Rust(Ausführungszyklen) | Relative Veränderung |
|---|---|---|---|
| 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% |
Allerdings ändern sich die Dekompressionswerte unter macOS gelegentlich. Wegen der Grenzen der Performance-Messwerkzeuge war eine genaue Analyse schwierig
Unterstützung für Cross-Compilation
- Die Cross-Compilation von Rust-Projekten mit C-Abhängigkeiten funktioniert dank der cc-Crate normalerweise gut, aber wenn sie fehlschlägt, ist das Debugging sehr schwierig
- Beim Linken von Systembibliotheken treten leicht unerwartete Probleme auf, und in einigen Umgebungen, darunter WebAssembly-Builds, wird das zu einem praktischen Hindernis
- Durch die Umstellung auf die Rust-Implementierung verschwinden C-bezogene Probleme vollständig
- Cross-Compilation ist nun auch für Windows, Android, WebAssembly und weitere Ziele ohne besondere Auffälligkeiten möglich
- Das ist nicht nur für die User Experience, sondern auch aus Wartungssicht ein großer Vorteil
Standardmäßig keine Symbol-Export-Konflikte
- Bei C-Abhängigkeiten müssen Symbole in externen Rust-Blöcken exportiert werden; wenn andere Abhängigkeiten dieselben Symbole exportieren, entstehen Konflikte
- libbz2-rs-sys ist so entworfen, dass standardmäßig keine Symbole exportiert werden
- Deshalb kommt es nicht zu Symbolkonflikten mit anderen externen Bibliotheken. Falls nötig, kann der Export per Feature-Flag aktiviert werden
MIRI-basierte Tests
- Um bzip2 in Rust performant zu implementieren, ist der Einsatz von unsafe Code unvermeidlich, und auch für die Nachbildung der C-Schnittstelle ist viel unsafe Code nötig
- Glücklicherweise lässt sich dieser Code in einer MIRI-Umgebung ausführen und testen
- Darüber hinaus können jetzt auch höher liegende Bibliotheken oder Anwendungen, die bzip2 verwenden, mit MIRI getestet werden
Fazit
Die bzip2-Crate ist jetzt schneller und bietet ganz selbstverständlich eine bessere Erfahrung, ohne dass man sich weiter darum kümmern muss
1 Kommentare
Hacker-News-Kommentare