高性能 Rust JSON ライブラリ sonic-rs オープンソース

1. sonic-rs の概要

sonic-rs は、sonic JSON ライブラリの Rust バージョンである SIMD に基づく高性能 Rust JSON ライブラリです。

Bytedance ソニック オープン ソース プロジェクトには、さまざまな言語の複数の JSON ライブラリが含まれるようになりました (以下を参照)。その中で、sonic-go は JIT と SIMD テクノロジーを使用した最初のオープンソースであり、sonic-cpp は C++ テンプレートと SIMD テクノロジーを使用しており、どちらの JSON ライブラリも Byte 内で大規模に実装されています。コスト最適化の観点から、Golang ビジネスの Rust への移行と Rust JSON パフォーマンスの最適化を支援するために、私たちは JSON 最適化の経験と実践に基づいて純粋な Rust 言語で高性能 JSON ライブラリ sonic-rs を開発しました。

現在 sonic-rs でサポートされている JSON 関数は比較的完全で、基本的に serde-json の関連関数と整合しており、より豊富な機能とより高性能なインターフェイスを提供します。 sonic-rs の主な機能は次のとおりです。

  • 基本的に Serde エコシステムと互換性があり、 Volo のFastStr型もサポートします

  • 動的な型のエンコードとデコード、およびオンデマンドの解析をサポート

  • サポートLazyVaueRawNumberの種類

  • UTF-8チェックサム標準浮動小数点精度をサポート

パフォーマンスに関しては、 serde-rs 公式ベンチマーク ( https://github.com/serde-rs/json-benchmark )が提供する Rust の構造と JSON データを基に、serde-json、simd-json、sonic を比較しました。 -rs in Rust 構造での解析パフォーマンスをテストしたところ、sonic-rs のパフォーマンスは simd-json の 1.5 ~ 2 倍、serde-json の 2 倍であることがわかります。

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 最適化の実践

sonic-rs の最適化は主に SIMD に基づいており、その一部は simd-json などの他の JSON ライブラリの最適化アイデアを利用しています。 SIMD(Single structive, multiple data)とは、1つの命令で複数のデータを並列処理できる並列最適化技術です。現在、ほとんどの CPU はすでにさまざまな SIMD 命令セットをサポートしています。たとえば、x86_64 アーキテクチャの SSE、AVX2、AVX512、aarch64 アーキテクチャの neon 命令セットなどです。 SIMD 命令を使用して最適化すると、適切なタスクに対して、プログラムが実行する命令が少なくなり、パフォーマンスが向上します。

全体的な設計の観点から見ると、sonic-rs は simd-json の 2 段階解析の考え方を採用していません。主に文字列シリアル化、オンデマンド解析、浮動小数点などの JSON 解析とシリアル化のホットスポットに SIMD 最適化を適用します。数値解析中。

2.1 SIMD に最適化された文字列シリアル化

文字列のシリアル化は、JSON シリアル化のホット スポットです。シリアル化するときは、文字列をスキャンしてエスケープ文字を見つける必要があります。長い文字列の場合、エスケープ文字をバイトごとに決定する操作は時間がかかります。エスケープ文字のスキャンは、SIMD を使用した高速化に非常に適しています。

次のコードに示すように、AVX2 命令を使用してエスケープ文字をスキャンする場合。この SIMD コードは Haswell アーキテクチャに基づいており、O3 最適化を有効にすると、実際には SIMD 命令は 6 つだけになります。つまり、6 つの SIMD 命令で一度に 32 バイトをスキャンできます。スカラー コードと比較して、プログラム命令の数が大幅に削減されるため、プログラムの実行時間が短縮されます。

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 SIMD 最適化のオンデマンド解析

多くのビジネス シナリオでは、JSON の一部のフィールドのみが使用されます。これは、オンデマンド解析や解析中に不要な JSON フィールドをスキップするのに非常に適しています。 JSON フィールドをスキップする場合、問題は JSON 内のオブジェクトと配列を効率的にスキップする方法にあります。

JSON 内のオブジェクトと配列の括弧が一致する必要があるという文法規則に基づいて、sonic-rs は SIMD を使用して効率的な括弧一致アルゴリズムを実装します。まず SIMD を通じて json オブジェクトと配列のビットマップを取得し、次に括弧の数を計算してオブジェクトと配列をスキップします。括弧の一致が見つかった場合、オブジェクトまたは配列をスキップできます。

2.3 SIMD に最適化された浮動小数点数解析

浮動小数点数の解析は、JSON 解析におけるパフォーマンスのホットスポットです。バイト内では、JSON のほとんどの浮動小数点数の仮数が比較的長く、SIMD 最適化にも適していることがわかります。以下に示すように、16 バイトの浮動小数点数の仮数「1234342112345678」の場合:

  1. まずこの文字列をベクトル レジスタに読み込みます。この時点では、ベクトル内の各数値は ASCII コードの値のままです。

  2. 次に、ベクトル減算を使用して ASCII コード「0」をバイトごとに減算し、v1 を取得します。現時点では。 v1 の数値はすでに 10 進数になっています。

  3. 次に、ベクトル命令を引き続き使用して、v1 の各数値の乗算と加算 (上位ビットを 10 で乗算し、下位ビットを加算) を実行して、v2 を取得します。 v2 の各数値はすでに 2 桁の 10 進数になっています。

  4. 同様に、SIMD 命令を使用してレイヤーごとに蓄積すると、最終的に v16 が得られます。 v16 には、最終的な仮数部の分析結果である 16 桁の数値が含まれています。

  5. 最後に、ベクトル命令を使用して v16 を u64 型に変換します。

解析プロセス全体は、浮動小数点仮数部のすべての文字を走査することなく、浮動小数点仮数部分析を完了できます。

3. sonic-rsの現状と計画

sonic-rs はオープンソースになってから 3 か月以上が経過しており、現在はバージョン 0.3 までバージョンアップされています。すでに Rust 安定版をサポートしており、aarch64 アーキテクチャもサポートしています。 sonic-rs は、開発者をあらゆる面で支援するためにいくつかの使用法ドキュメントを蓄積しました。

将来的には、sonic-rs はパフォーマンス、使いやすさ、安定性の向上を継続し、Bytes/FastStr一般的なデータ型のゼロコピー解析のサポート、演習中の SIMD 命令の検出のサポートなどが期待されています。興味のある開発者はぜひご参加ください。 。

プロジェクトアドレス

GitHub:https://github.com/cloudwego 

公式ウェブサイト: www.cloudwego.io

 

 

「Celebrated More Than Years 2」の海賊版リソースが npm にアップロードされたため、npmmirror は unpkg サービスを停止せざるを得なくなり、 最初の創設者の 数百人が参加して、一斉に米国に向かいました。 フロントエンド視覚化ライブラリと Baidu の有名なオープンソース プロジェクト ECharts - Fish 詐欺師をサポートするために「海へ行く」が、TeamViewer を使用して 398 万を送金しました。リモート デスクトップ ベンダーは何をすべきでしょうか? 周宏宜: Google に残された時間はあまり多くありません。すべての製品をオープンソースにすることが推奨されています。 ある有名なオープンソース企業の元従業員が、部下から異議を申し立てられた後、激怒しました。妊娠中の女性従業員を解雇しました。Google は Android 仮想マシンで ChromeOS を実行する方法を示しました。 ここで time.sleep(6) はどのような役割を果たしますか? マイクロソフト、中国のAIチームが「米国のために荷造りしている」という噂に反応 人民日報オンラインはオフィスソフトのマトリョーシカのような課金についてコメント:「セット」を積極的に解決することによってのみ、私たちは未来を手に入れることができる
{{名前}}
{{名前}}

おすすめ

転載: my.oschina.net/u/4843764/blog/11044020