Leistungsstarke Rust-JSON-Bibliothek sonic-rs Open Source

1. Einführung in Sonic-RS

sonic-rs ist eine leistungsstarke Rust-JSON-Bibliothek, die auf SIMD basiert, der Rust-Version der Sonic-JSON-Bibliothek.

Das Open-Source-Projekt Bytedance Sonic umfasst jetzt mehrere JSON-Bibliotheken in verschiedenen Sprachen (wie unten gezeigt). Unter ihnen war sonic-go das erste Open-Source-Programm mit JIT- und SIMD-Technologie, und sonic-cpp nutzte C++-Vorlagen und SIMD-Technologie. Beide JSON-Bibliotheken wurden in großem Umfang innerhalb von Byte implementiert. Um Golang-Unternehmen bei der Migration zu Rust zu unterstützen und die JSON-Leistung von Rust zu optimieren, haben wir im Rahmen der Kostenoptimierung eine leistungsstarke JSON-Bibliothek sonic-rs in reiner Rust-Sprache entwickelt, die auf unserer Erfahrung und Praxis bei der JSON-Optimierung basiert.

Die derzeit von sonic-rs unterstützten JSON-Funktionen sind relativ vollständig, im Wesentlichen auf die verwandten Funktionen von serde-json abgestimmt und bieten umfangreichere Funktionen und leistungsfähigere Schnittstellen. Die Hauptmerkmale von Sonic-RS sind:

  • FastStrGrundsätzlich kompatibel mit dem Serde-Ökosystem und unterstützt auch Typen in Volo

  • Unterstützt dynamische Typkodierung und -dekodierung sowie On-Demand-Analyse

  • Support LazyVaueusw. RawNumberTypen

  • Unterstützt UTF-8Prüfsummen-Standard-Gleitkommagenauigkeit

In Bezug auf die Leistung haben wir uns auf die Rust-Struktur und die JSON-Daten des offiziellen serde-rs-Benchmarks ( https://github.com/serde-rs/json-benchmark ) gestützt und serde-json, simd-json und sonic verglichen -rs in Die Analyseleistung unter der Rust-Struktur wurde getestet und es kann festgestellt werden, dass die Leistung von sonic-rs 1,5 bis 2-mal so hoch ist wie die von simd-json und 2-mal so hoch wie die von serde-json:

twitter/sonic_rs::from_slice_unchecked
                        time:   [694.74 µs 707.83 µs 723.19 µs]
twitter/sonic_rs::from_slice
                        time:   [796.44 µs 827.74 µs 861.30 µs]
twitter/simd_json::from_slice
                        time:   [1.0615 ms 1.0872 ms 1.1153 ms]
twitter/serde_json::from_slice
                        time:   [2.2659 ms 2.2895 ms 2.3167 ms]
twitter/serde_json::from_str
                        time:   [1.3504 ms 1.3842 ms 1.4246 ms]

citm_catalog/sonic_rs::from_slice_unchecked
                        time:   [1.2271 ms 1.2467 ms 1.2711 ms]
citm_catalog/sonic_rs::from_slice
                        time:   [1.3344 ms 1.3671 ms 1.4050 ms]
citm_catalog/simd_json::from_slice
                        time:   [2.0648 ms 2.0970 ms 2.1352 ms]
citm_catalog/serde_json::from_slice
                        time:   [2.9391 ms 2.9870 ms 3.0481 ms]
citm_catalog/serde_json::from_str
                        time:   [2.5736 ms 2.6079 ms 2.6518 ms]

canada/sonic_rs::from_slice_unchecked
                        time:   [3.7779 ms 3.8059 ms 3.8368 ms]
canada/sonic_rs::from_slice
                        time:   [3.9676 ms 4.0212 ms 4.0906 ms]
canada/simd_json::from_slice
                        time:   [7.9582 ms 8.0932 ms 8.2541 ms]
canada/serde_json::from_slice
                        time:   [9.2184 ms 9.3560 ms 9.5299 ms]
canada/serde_json::from_str
                        time:   [9.0383 ms 9.2563 ms 9.5048 ms]


2. Sonic-RS-Optimierungspraxis

Die Optimierung von sonic-rs basiert hauptsächlich auf SIMD und greift teilweise auf die Optimierungsideen anderer JSON-Bibliotheken wie simd-json zurück. SIMD (Single Instruction, Multiple Data) ist eine parallele Optimierungstechnologie, die mehrere Daten parallel mit einem Befehl verarbeiten kann. Die meisten CPUs unterstützen heute bereits verschiedene SIMD-Befehlssätze. Zum Beispiel SSE, AVX2, AVX512 unter x86_64-Architektur, Neon-Befehlssatz unter aarch64-Architektur usw. Nach der Optimierung mithilfe von SIMD-Anweisungen führt das Programm für eine geeignete Aufgabe weniger Anweisungen aus und ist daher leistungsfähiger.

Im Hinblick auf das Gesamtdesign übernimmt sonic-rs nicht die zweistufige Parsing-Idee von simd-json. Es wendet die SIMD-Optimierung hauptsächlich auf Hotspots bei der JSON-Analyse und -Serialisierung an, einschließlich String-Serialisierung, On-Demand-Analyse und Gleitkomma Zahlenanalyse warten.

2.1 SIMD-optimierte String-Serialisierung

Die String-Serialisierung ist der Hotspot der JSON-Serialisierung. Beim Serialisieren müssen Sie die Zeichenfolge nach Escape-Zeichen durchsuchen. Bei längeren Zeichenfolgen ist die byteweise Ermittlung von Escape-Zeichen zeitaufwändig. Das Scannen von Escape-Zeichen eignet sich sehr gut zur Beschleunigung mit SIMD.

Wenn Sie AVX2-Anweisungen zum Scannen von Escape-Zeichen verwenden, wie im folgenden Code gezeigt. Dieser SIMD-Code unterliegt der Haswell-Architektur. Nach der Aktivierung der O3-Optimierung gibt es tatsächlich nur sechs SIMD-Anweisungen, dh 6 SIMD-Anweisungen können jeweils 32 Bytes scannen. Im Vergleich zum Skalarcode wird die Anzahl der Programmanweisungen stark reduziert, wodurch die Ausführungszeit des Programms verkürzt wird.

static inline __m256i _mm256_find_quote(__m256i vv) {
    __m256i e1 = _mm256_cmpgt_epi8   (vv, _mm256_set1_epi8(-1));
    __m256i e2 = _mm256_cmpgt_epi8   (vv, _mm256_set1_epi8(31));
    __m256i e3 = _mm256_cmpeq_epi8   (vv, _mm256_set1_epi8('"'));
    __m256i e4 = _mm256_cmpeq_epi8   (vv, _mm256_set1_epi8('\\'));
    __m256i r1 = _mm256_andnot_si256 (e2, e1);
    __m256i r2 = _mm256_or_si256     (e3, e4);
    __m256i rv = _mm256_or_si256     (r1, r2);
    return rv;
}

2.2 On-Demand-Analyse der SIMD-Optimierung

Viele Geschäftsszenarien verwenden nur einige Felder in JSON, was sich sehr gut für die bedarfsgesteuerte Analyse eignet und unnötige JSON-Felder während der Analyse überspringt. Beim Überspringen von JSON-Feldern liegt die Schwierigkeit darin, Objekte und Arrays in JSON effizient zu überspringen.

Basierend auf den grammatikalischen Regeln, denen Objekt- und Array-Klammern in JSON entsprechen müssen, verwendet sonic-rs SIMD, um einen effizienten Klammer-Matching-Algorithmus zu implementieren. Rufen Sie zuerst die Bitmap des JSON-Objekts und -Arrays über SIMD ab und überspringen Sie dann das Objekt und das Array, indem Sie die Anzahl der Klammern berechnen. Wenn eine Klammerübereinstimmung gefunden wird, kann das Objekt oder Array übersprungen werden.

2.3 SIMD-optimierte Gleitkommazahlenanalyse

Das Parsen von Gleitkommazahlen ist ein Leistungs-Hotspot beim JSON-Parsen. Innerhalb der Bytes stellen wir fest, dass die Mantissen der meisten Gleitkommazahlen in JSON relativ lang sind und sich auch für die SIMD-Optimierung eignen. Wie unten gezeigt, gilt für eine 16-Byte-Gleitkommazahl-Mantisse „1234342112345678“:

  1. Lesen Sie diese Zeichenfolge zuerst in das Vektorregister. Zu diesem Zeitpunkt ist jede Zahl im Vektor immer noch der Wert des ASCII-Codes.

  2. Zweitens verwenden Sie die Vektorsubtraktion, um den ASCII-Code „0“ Byte für Byte zu subtrahieren, um v1 zu erhalten. Zu diesem Zeitpunkt. Die Zahlen in Version 1 sind bereits dezimal.

  3. Verwenden Sie dann weiterhin Vektoranweisungen, um jede Zahl in v1 zu multiplizieren und zu addieren (multiplizieren Sie das hohe Bit mit 10 und addieren Sie das niedrige Bit), um v2 zu erhalten. Jede Zahl in Version 2 ist bereits eine zweistellige Dezimalzahl.

  4. Analog dazu wird mithilfe von SIMD-Anweisungen Schicht für Schicht akkumuliert und schließlich v16 erhalten. v16 enthält eine 16-stellige Zahl, die das endgültige Ergebnis der Mantissenanalyse darstellt.

  5. Schließlich verwenden wir Vektoranweisungen, um v16 in den Typ u64 zu konvertieren.

Der gesamte Parsing-Prozess kann die Gleitkomma-Mantissenanalyse abschließen, ohne jedes Zeichen der Gleitkomma-Mantisse zu durchlaufen.

3. Sonic-RS-Status und Pläne

sonic-rs ist seit mehr als drei Monaten Open Source und wird derzeit auf Version 0.3 iteriert. Es unterstützt bereits die stabile Rust-Version und unterstützt die aarch64-Architektur. sonic-rs hat einige Nutzungsdokumente zusammengestellt, um Entwicklern in allen Aspekten zu helfen:

In Zukunft wird sonic-rs die Leistung, Benutzerfreundlichkeit und Stabilität weiter verbessern. Es wird erwartet, dass es das Bytes/FastStrkopierlose Parsen gängiger Datentypen unterstützt, die Erkennung von SIMD-Anweisungen während des Trainings unterstützt usw. Interessierte Entwickler sind herzlich willkommen, sich uns anzuschließen .

Projektadresse

GitHub: https://github.com/cloudwego 

Offizielle Website: www.cloudwego.io

 

 

Die Raubkopien von „Celebrating More Than Years 2“ wurden auf npm hochgeladen, was dazu führte, dass npmmirror den Unpkg-Dienst einstellen musste und sich gemeinsam mit Hunderten von Menschen in die USA begab Front-End-Visualisierungsbibliothek und Baidus bekanntes Open-Source-Projekt ECharts – „Going to the Sea“ zur Unterstützung Fischbetrüger nutzten TeamViewer, um 3,98 Millionen zu überweisen! Was sollten Remote-Desktop-Anbieter tun? Zhou Hongyi: Für Google bleibt nicht mehr viel Zeit. Es wird empfohlen, dass alle Produkte Open Source sind. Ein ehemaliger Mitarbeiter eines bekannten Open-Source-Unternehmens brachte die Nachricht: Nachdem er von seinen Untergebenen herausgefordert wurde, wurde der technische Leiter wütend hat die schwangere Mitarbeiterin entlassen. Google hat gezeigt, wie man ChromeOS in einer virtuellen Android-Maschine ausführt. Bitte geben Sie mir einen Rat, welche Rolle time.sleep(6) hier spielt. Microsoft reagiert auf Gerüchte, dass Chinas KI-Team „für die USA packt“. People's Daily Online kommentiert die matroschkaartige Aufladung von Bürosoftware: Nur durch das aktive Lösen von „Sets“ können wir eine Zukunft haben
{{o.name}}
{{m.name}}

Ich denke du magst

Origin my.oschina.net/u/4843764/blog/11044020
Empfohlen
Rangfolge