1. Introduction à Sonic-RS
sonic-rs est une bibliothèque Rust JSON hautes performances basée sur SIMD, qui est la version Rust de la bibliothèque Sonic JSON.
Le projet open source Bytedance Sonic comprend désormais plusieurs bibliothèques JSON dans différentes langues (comme indiqué ci-dessous). Parmi eux, sonic-go a été le premier à être open source, utilisant les technologies JIT et SIMD, et sonic-cpp a utilisé des modèles C++ et la technologie SIMD. Les deux bibliothèques JSON ont été implémentées à grande échelle au sein de Byte. Dans le contexte de l'optimisation des coûts, afin d'aider l'entreprise Golang à migrer vers Rust et à optimiser les performances de Rust JSON, nous avons développé une bibliothèque JSON haute performance sonic-rs en langage Rust pur basée sur notre expérience et notre pratique d'optimisation JSON.
-
sonic : https://github.com/bytedance/sonic (bibliothèque Golang JSON)
-
sonic-cpp : https://github.com/bytedance/sonic-cpp (bibliothèque C++ JSON)
-
sonic-rs : https://github.com/cloudwego/sonic-rs (bibliothèque Rust JSON)
Les fonctions JSON actuellement prises en charge par sonic-rs sont relativement complètes, essentiellement alignées sur les fonctions associées de serde-json, et offrent des fonctions plus riches et des interfaces plus performantes. Les principales caractéristiques de Sonic-RS sont :
-
FastStr
Fondamentalement compatible avec l'écosystème Serde, et prend également en charge les types dans Volo -
Prise en charge de l'encodage et du décodage de type dynamique et de l'analyse à la demande
-
Types de support
LazyVaue
,RawNumber
etc. -
Prend en charge
UTF-8
la précision à virgule flottante standard de la somme de contrôle
En termes de performances, nous nous sommes basés sur la structure Rust et les données JSON fournies par le benchmark officiel serde-rs ( https://github.com/serde-rs/json-benchmark ), et avons comparé serde-json, simd-json et sonic -rs in Les performances d'analyse sous la structure Rust ont été testées, et on peut constater que les performances de sonic-rs sont 1,5 à 2 fois celles de simd-json et 2 fois celles de 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. Pratique d'optimisation Sonic-RS
L'optimisation de sonic-rs est principalement basée sur SIMD, et s'appuie en partie sur les idées d'optimisation d'autres bibliothèques JSON telles que simd-json. SIMD (Single instruction, multiple data) est une technologie d'optimisation parallèle qui peut traiter plusieurs données en parallèle avec une seule instruction. Aujourd'hui, la plupart des processeurs prennent déjà en charge divers jeux d'instructions SIMD. Par exemple, SSE, AVX2, AVX512 sous architecture x86_64, jeu d'instructions néon sous architecture aarch64, etc. Après avoir optimisé à l'aide des instructions SIMD, pour une tâche appropriée, le programme exécutera moins d'instructions et sera donc plus performant.
En termes de conception globale, sonic-rs n'adopte pas l'idée d'analyse en deux étapes de simd-json. Il applique principalement l'optimisation SIMD aux points chauds de l'analyse et de la sérialisation JSON, y compris la sérialisation des chaînes, l'analyse à la demande et la virgule flottante. analyse du numéro, attendez.
2.1 Sérialisation de chaîne optimisée SIMD
La sérialisation de chaînes est le point chaud de la sérialisation JSON. Lors de la sérialisation, vous devez analyser la chaîne à la recherche de caractères d'échappement. Pour les chaînes plus longues, l'opération de détermination des caractères d'échappement octet par octet prend du temps. L'analyse des caractères d'échappement est très appropriée pour accélérer l'utilisation de SIMD.
Si vous utilisez les instructions AVX2 pour analyser les caractères d'échappement, comme indiqué dans le code suivant. Ce code SIMD est sous l'architecture Haswell. Une fois l'optimisation O3 activée, il n'y a en fait que six instructions SIMD, c'est-à-dire que 6 instructions SIMD peuvent analyser 32 octets à la fois. Par rapport au code scalaire, le nombre d'instructions du programme est considérablement réduit, réduisant ainsi le temps d'exécution du programme.
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 Analyse à la demande d'optimisation SIMD
De nombreux scénarios commerciaux n'utilisent que certains champs en JSON, ce qui est très approprié pour l'analyse à la demande et pour ignorer les champs JSON inutiles lors de l'analyse. Lorsque vous ignorez des champs JSON, la difficulté réside dans la manière d'ignorer efficacement les objets et les tableaux en JSON.
Sur la base des règles grammaticales auxquelles les parenthèses d'objet et de tableau dans JSON doivent correspondre, sonic-rs utilise SIMD pour implémenter un algorithme de correspondance de parenthèses efficace. Obtenez d'abord le bitmap de l'objet et du tableau json via SIMD, puis ignorez l'objet et le tableau en calculant le nombre de parenthèses. Lorsqu'une correspondance entre crochets est trouvée, l'objet ou le tableau peut être ignoré.
2.3 Analyse des nombres à virgule flottante optimisée SIMD
L'analyse des nombres à virgule flottante est un point chaud de performances dans l'analyse JSON. Au sein des octets, nous constatons que les mantisses de la plupart des nombres à virgule flottante en JSON sont relativement longues et conviennent également à l'optimisation SIMD. Comme indiqué ci-dessous, pour une mantisse de nombre à virgule flottante de 16 octets "1234342112345678" :
-
Lisez d'abord cette chaîne dans le registre vectoriel. À ce stade, chaque nombre du vecteur est toujours la valeur du code ASCII.
-
Deuxièmement, utilisez la soustraction vectorielle pour soustraire le code ASCII « 0 » octet par octet pour obtenir v1. En ce moment. Les nombres de la v1 sont déjà en décimal.
-
Ensuite, continuez à utiliser les instructions vectorielles pour multiplier et ajouter chaque nombre dans v1 (multipliez le bit haut par 10 et ajoutez le bit bas) pour obtenir v2. Chaque nombre dans la v2 est déjà un nombre décimal à deux chiffres.
-
Par analogie, en utilisant les instructions SIMD pour accumuler couche par couche, v16 est finalement obtenu. La v16 contient un nombre à 16 chiffres, qui est le résultat final de l'analyse de la mantisse.
-
Enfin, nous utilisons des instructions vectorielles pour convertir le type v16 en u64.
L'ensemble du processus d'analyse peut compléter l'analyse de la mantisse à virgule flottante sans parcourir chaque caractère de la mantisse à virgule flottante.
3. Statut et plans de Sonic-RS
sonic-rs est open source depuis plus de trois mois et est actuellement itéré vers la version 0.3. Il prend déjà en charge la version stable de Rust et prend en charge l'architecture aarch64. sonic-rs a accumulé quelques documents d'utilisation pour aider les développeurs dans tous les aspects :
-
Golang migre les utilisateurs de Rust pour utiliser sonic-rs : https://github.com/cloudwego/sonic-rs/blob/main/docs/for_Golang_user_zh.md
-
Migration des utilisateurs Rust serde-json sonic-rs : https://github.com/cloudwego/sonic-rs/blob/main/docs/serdejson_compatibility.md
-
Détails de l'optimisation des performances : https://github.com/cloudwego/sonic-rs/blob/main/docs/performance_zh.md
À l'avenir, sonic-rs continuera d'améliorer les performances, la facilité d'utilisation et la stabilité. Il devrait prendre en charge Bytes/FastStr
l'analyse sans copie des types de données courants, prendre en charge la détection des instructions SIMD pendant l'exercice, etc. Les développeurs intéressés sont invités à nous rejoindre. .
adresse du projet
GitHub:https://github.com/cloudwego
Site officiel : www.cloudwego.io
Les ressources piratées de "Celebrating More Than Years 2" ont été téléchargées sur npm, obligeant npmmirror à suspendre le service unpkg. L'équipe chinoise d' IA de Microsoft a fait ses valises et s'est rendue aux États-Unis, impliquant des centaines de personnes. La bibliothèque de visualisation frontale et le projet open source bien connu de Baidu, ECharts - "aller à la mer" pour soutenir les escrocs Fish ont utilisé TeamViewer pour transférer 3,98 millions ! Que doivent faire les fournisseurs de postes de travail à distance ? Zhou Hongyi : Il ne reste plus beaucoup de temps à Google. Il est recommandé que tous les produits soient open source. Un ancien employé d'une société open source bien connue a annoncé la nouvelle : après avoir été interpellé par ses subordonnés, le responsable technique est devenu furieux et. a licencié l'employée enceinte. Google a montré comment exécuter ChromeOS sur une machine virtuelle Android. Veuillez me donner quelques conseils, quel rôle joue ici time.sleep(6). Microsoft réagit aux rumeurs selon lesquelles l'équipe chinoise d'IA "fait ses valises pour les États-Unis" Le Quotidien du Peuple commente en ligne la charge de type matriochka des logiciels de bureau : Ce n'est qu'en résolvant activement les "ensembles" que nous pourrons avoir un avenir