- Wenn man das von Ubuntu bereitgestellte Quellpaket von
jq selbst baut, kann sich die Leistung um bis zu 90 % verbessern
- Durch Verbesserungen bei Compiler, Optimierungs-Flags und Speicher-Allocatoren lässt sich die Performance maximieren
Setup
jq wird zur Verarbeitung von GeoJSON-Dateien im JSON-Format verwendet
- Es wird eine Abfrage ausgeführt, die aus der 500 MB großen Parcel-Map des Alameda County Assessor für alle Parcels ab einem bestimmten Wert den Stadtnamen ausgibt
- Auf einem Ryzen-9-9950X-System dauert dies mit gecachten Dateien etwa 5 Sekunden, daher wurde versucht, das zu verbessern
Schritt 1: Paket neu bauen
- Quellcode von
jq von Launchpad herunterladen und ohne zusätzliche Flags neu bauen
- Ergebnis: 2–4 % Leistungsverbesserung
- Benchmark-Ergebnisse
- Gebautes jq: durchschnittlich 4,517 Sekunden
- Standardpaket von Ubuntu: durchschnittlich 4,641 Sekunden
- Leistungsverbesserung: 1,03-fach schneller
Schritt 2: Clang und erweiterte Optimierungs-Flags verwenden
- Mit Clang-18 kompilieren und Optimierungsstufe sowie LTO verwenden
- Verwendete Haupt-Flags:
-O3 → höhere Optimierungsstufe
-flto → Link-Time Optimization aktivieren
-DNDEBUG → Debug-Code ausschließen
- Benchmark-Ergebnisse
- Gebautes jq: durchschnittlich 3,853 Sekunden
- Standardpaket von Ubuntu: durchschnittlich 4,631 Sekunden
- Leistungsverbesserung: 1,20-fach schneller
Schritt 3: TCMalloc hinzufügen
- Statt des Standard-
malloc von GNU libc wird TCMalloc verwendet
- Mit zusätzlichem
-L/usr/lib/x86_64-linux-gnu -ltcmalloc_minimal bauen
- Benchmark-Ergebnisse
- Gebautes jq: durchschnittlich 3,253 Sekunden
- Standardpaket von Ubuntu: durchschnittlich 4,611 Sekunden
- Leistungsverbesserung: 1,42-fach schneller
Schritt 4: Dynamisches Preload von TCMalloc anwenden
- Im Ubuntu-Standardpaket wird TCMalloc per dynamischem Preload verwendet
- Benchmark-Ergebnisse
- Standard-jq: durchschnittlich 4,601 Sekunden
- jq mit TCMalloc: durchschnittlich 4,082 Sekunden
- Leistungsverbesserung: 1,13-fach schneller
Schritt 5: Dynamisches Preload anderer Allocatoren testen
- Test von jemalloc und mimalloc, zwei weiteren von Ubuntu bereitgestellten Speicher-Allocatoren
- mimalloc liefert die beste Leistung
- Benchmark-Ergebnisse
- Standard-jq: durchschnittlich 4,123 Sekunden
- jq mit TCMalloc: durchschnittlich 4,130 Sekunden
- jq mit Jemalloc: durchschnittlich 3,510 Sekunden
- jq mit Mimalloc: durchschnittlich 3,154 Sekunden → 1,31-fache Leistungsverbesserung
Schritt 6: Direkt mit mimalloc bauen
- mimalloc wird nicht per dynamischem Preload, sondern statisch gelinkt
- Maximale Leistung
- Benchmark-Ergebnisse
- Gebautes jq: durchschnittlich 2,428 Sekunden
- Standardpaket von Ubuntu: durchschnittlich 4,606 Sekunden
- Leistungsverbesserung: 1,90-fach schneller
🚀 Endergebnis
- Das selbst gebaute jq ist 90 % schneller als das Ubuntu-Paket
- Leistung bei der Verarbeitung von 13.000 JSON-Dateien mit 2,2 GB:
- Gebautes jq: 0,755 Sekunden
- Standard-jq: 1,424 Sekunden
- Leistungsverbesserung: etwa 2-fach
1 Kommentare
Hacker-News-Kommentare
Der Titel „Ubuntu-Pakete neu bauen und durch Wechsel des Speicher-Allocators 90 % schneller machen“ wirkt wie Clickbait
jemallocper Preload verwendet, um diemalloc-Implementierung auszutauschen, und damit positive Ergebnisse bei der Stabilisierung der Speichernutzung erzieltEngineering ist die Kunst des Kompromisses
Gentoo Linux ist ein Betriebssystem, das darauf ausgelegt ist, für den jeweiligen Einsatzzweck des Nutzers optimiert zu werden
Wenn man Pakete wie
jqmanuell installiert, kann man Sicherheitsupdates verpassenonigurama, und wenn so etwas erneut passiert, könnte man verwundbar seinDie Verwendung eines inoffiziellen
mallockann seltsame Bugs verursachenWenn ich lese, dass man mit einer einfachen Änderung einen großen Geschwindigkeitsschub erzielen kann, möchte ich den Entwicklern von
jqdavon erzählenEs kann sinnvoll sein, Pakete aus dem Quellcode zu kompilieren oder offizielle Binärdateien herunterzuladen
Die Rust-Funktion
cargo installist nützlich, weil sie Optimierungen für eine bestimmte Plattform ermöglichtjaqundyqsind Optionen, die ich häufig verwende, um bei der Nutzung vonjqLeistungsverbesserungen zu erzielenNach dem Wechsel des Speicher-Allocators kann man durch Neubauen von Ubuntu-Paketen 90 % mehr Geschwindigkeit erreichen