4 Punkte von GN⁺ 2025-03-17 | 1 Kommentare | Auf WhatsApp teilen
  • zlib-rs ist eine Rust-basierte zlib-Implementierung für die Datenkomprimierung; mit der kürzlich veröffentlichten Version 0.4.2 wurde die Performance deutlich verbessert
  • Derzeit ist es die schnellste API-kompatible zlib-Implementierung und insbesondere bei der Dekomprimierung der Konkurrenz überlegen
  • Wichtige Performance-Verbesserungen: automatische Auswahl der optimalen SIMD-Implementierung zur Laufzeit, Anwendung von DFA-Optimierungen usw.

Multiversioning

  • Zur Laufzeit wird abhängig von der CPU automatisch die schnellste Funktionsversion gewählt
  • In Rust gibt es standardmäßig keine Unterstützung für Multiversioning, daher muss es manuell implementiert werden
  • Bietet optimale Performance bei minimalem Laufzeit-Overhead im Code

DFA-Optimierung (Deterministic Finite Automata)

  • C verbessert die Performance durch implizites Fallthrough in switch-Anweisungen
  • In Rust gibt es keinen vergleichbaren Mechanismus, was zu Performance-Verlusten führt
  • Anwendung der LLVM-Option -Cllvm-args=-enable-dfa-jump-thread → Performance wiederhergestellt
  • Nicht in den LLVM-Standardeinstellungen enthalten, soll aber künftig in Rustc standardmäßig aktiviert werden

Benchmark-Vergleich der Performance

1. Performance-Vergleich mit zlib-ng

  • zlib-rs zeigt bei den meisten Eingabegrößen eine bessere Performance als zlib-ng
  • Besonders bei 1-KB-Eingaben etwa 10 % schneller und bei 65-KB-Eingaben etwa 6 % schneller
  • Bei den kleinsten Eingabegrößen etwas langsamer, insgesamt aber meist im Vorteil

Zum Beispiel:

  • Bei einer Eingabegröße von 4 Byte ist zlib-ng etwas schneller, in der Praxis fällt das jedoch kaum ins Gewicht
  • Bei einer Eingabegröße von 1 KB ist zlib-rs etwa 10 % schneller
  • Bei einer Eingabegröße von 65 KB ist zlib-rs etwa 6 % schneller

→ Gegenüber zlib-ng klarer Performance-Vorteil bei großen Chunks

2. Performance-Vergleich mit zlib-chromium

  • Bei kleinen Chunks ist zlib-chromium schneller
  • Bei großen Chunks ist jedoch zlib-rs überlegen
  • Bei typischen Eingabegrößen liefert zlib-rs die bessere Performance

Zum Beispiel:

  • Bei einer Eingabegröße von 4 Byte ist zlib-chromium etwa 12 % schneller
  • Bei einer Eingabegröße von 16 Byte ist zlib-chromium etwa 6 % schneller
  • Ab einer Eingabegröße von 1 KB liegt zlib-rs vorn

→ Performance-Vorteil von zlib-rs bei typischen Größen

Vergleich der Komprimierungsleistung

  • Die Komprimierungsleistung wird noch verbessert und zeigt gemischte Ergebnisse
  • Auf dem Standard-Komprimierungslevel (6) 6 % schneller, auf dem höchsten Komprimierungslevel (9) 13 % schneller
  • Bei anderen Komprimierungsstufen ist zlib-ng weiterhin schneller

Zum Beispiel:

  • Auf Komprimierungslevel 6 ist zlib-rs etwa 6 % schneller als zlib-ng
  • Auf Komprimierungslevel 9 ist zlib-rs etwa 13 % schneller als zlib-ng
  • Bei Komprimierungslevel 1–4 liegt jedoch zlib-ng vorn

Fazit

  • zlib-rs ist bei der Dekomprimierungsleistung zlib-ng und zlib-chromium überlegen
  • Die Komprimierungsleistung wird weiter verbessert und zeigt bei wichtigen Komprimierungsstufen deutliche Fortschritte
  • Sowohl in Rust- als auch in C-Projekten einsetzbar
    • Rust → Im flate2-Crate das Flag zlib-rs verwenden
    • C → Kann als dynamische Bibliothek kompiliert und verwendet werden

1 Kommentare

 
GN⁺ 2025-03-17
Hacker-News-Kommentare
  • Mir wurde klar, dass ich Rust bereits kenne

    • Ich dachte, Rusts Zweck sei Sicherheit, aber diese Bibliothek verwendet das Schlüsselwort unsafe sehr häufig
    • Ich frage mich, ab welchem Punkt der Unterschied zwischen C und Rust bedeutungslos wird
    • Mit Inline-Assembler können beide Sprachen denselben Maschinencode erzeugen
    • Ich frage mich, ob der Rust-Compiler besser optimiert als ein C-Compiler
  • „Schneller als C“ läuft letztlich auf anderes Design, andere Implementierung, andere Algorithmen usw. hinaus

    • Es kann schneller sein als eine bereits existierende Implementierung, aber die Behauptung „schneller als C“ ist seltsam
  • zippy in Nim behauptet, 1,5- bis 2-mal schneller als zlib zu sein

    • Es gibt auch in C zlib-Implementierungen, die schneller sind als die Standardinstallation
    • zlib ist heutzutage veraltet, aber weiterhin beliebt
    • Es wird als Grundlage für neuere, parallelisierungsfreundliche Formate verwendet
  • Ich frage mich, ob Rusts Leistung mit Rust selbst zu tun hat oder ob es einfach stärker optimiert ist als andere C-Versionen

    • Es gibt Fälle, etwa beim Sortieren, in denen C++ konsistent bessere Leistung als C liefert
    • Ich frage mich, ob es zwischen Rust und C etwas Ähnliches gibt
  • Chromium verwendet zlib wegen des im Standard festgelegten Algorithmus

    • Wenn man einen besseren Algorithmus wählen kann, lässt sich auch bessere Leistung erzielen
    • Zstandard ist schneller und komprimiert auch besser
    • LZ4 ist deutlich schneller, verkleinert die Daten aber nicht stark
  • Zstandard und blake3-Digests sind erlaubt

  • Es wäre genauer zu sagen, dass Rust so schnell wie C ist

    • Das ist immer noch eine große Leistung
  • Welche Bibliothek kompiliert schneller

    • Welche Bibliothek hat weniger Abhängigkeiten
    • Ob die Größe der jeweiligen Bibliotheken gleich ist und welche kleiner ist
  • Rust-Nutzer vergleichen Rust und C gern miteinander, aber C-Nutzer vergleichen C und Rust nur selten

  • Bei kompilierten Systemsprachen hat die Sprache selbst kaum Einfluss auf die Geschwindigkeit

    • Optimierte Versionen kontrollieren Allokationen, verwenden gute Speicherzugriffsmuster und nutzen SIMD sowie Multithreading; dadurch können sie leicht mehr als 100-mal schneller sein
    • Schon besserer Speicherzugriff allein kann ein Programm mehr als 20-mal beschleunigen
  • Gemeint ist, dass die Implementierung schneller ist als die in C

    • Ein „schneller als C“ gibt es nicht