おなじみC/C++から使えるJSONライブラリを紹介するコーナー。まずは過去のまとめ。
- ヘッダファイルだけでC++から使えるJSONパーサ「picojson」が凄い!
- 何も見ずにC++でjsonパーサが書けるか試してみた。
- C言語から使えるJSONパーサ、JSMNを試してみた。
- 僕がboost::asioとboost::property_treeを使いHTTPプロキシ環境下で非同期にGoogle Search APIから検索するまでにやった、たった一つの事。
- C言語から使えるJSONパーサ、parson が思った以上に良い仕事をしている。
- 最速と言われる JSON パーサ「rapidjson」が本当に爆速なのか試してみた。
- C言語から使えるJSONパーサ、jansson がとても直感的で良い
- C++ で STL フレンドリに扱えるJSONパーサ「json.hpp」
- コメントも扱える高機能な C++ 向け JSON パーサ「jsoncpp」
C/C++ から扱える JSON ライブラリを数多く紹介してきましたが、パフォーマンスの観点では simdjson が不動の物にしていました。
GitHub - simdjson/simdjson: Parsing gigabytes of JSON per second
Documentation Usage documentation is available: Basics is an overview of how to use simdjson and its...
https://github.com/simdjson/simdjson
がしかし yyjson の登場により、この認識を改めなければならなくなりました。
GitHub - ibireme/yyjson: The fastest JSON library in C
yyjson A high performance JSON library written in ANSI C. Features Fast : can read or write gigabyte...
https://github.com/ibireme/yyjson
まずはこのベンチマーク結果を見て下さい。
追記 このグラフは simdjson の DOM API という古い API が使われていた頃の物らしく、ondemand API という最近の API を使うとまた結果が異なる様です。
一部で simdjson の方が勝ってはいるものの、殆どのケースで yyjson が上回っています。
yyjson の特徴は以下の通り。
- 高速: 最新の CPU で秒間ギガバイトの JSON データを読み書きできる
- ポータブル: ANSI C(C89)に準拠
- 標準: RFC8259 標準に厳密に準拠
- 安全: 完全な JSON 形式、数値形式、UTF-8 バリデーション
- 精度: int64、uint64、および double の数値を正確に読み書き可能
- 制限が少ない: 無制限の JSON レベル、
\u0000
および null で終了しない文字列をサポート - 拡張可能: コメント、末尾のコンマ、nan/inf、カスタムメモリアロケータを許可するオプション
- 開発者向け: 1個のヘッダファイル1個のCファイルのみ、統合が簡単
ソースの中を見てみましたが、随所で SIMD による最適化が行われています。データ構造も SIMD で扱う為に 64 ビット単位(タイプ、長さ、ペイロードの3つで 128 ビット)にしてあります。
いつもの通りサンプルコードを書いてみました。本ブログサイトのエントリを JSON 形式にした物をパースしてみます。
#include
#include
int
main() {
yyjson_read_err err;
yyjson_doc *doc = yyjson_read_file("foo.json",
YYJSON_READ_NOFLAG,
NULL,
&err);
if (!doc) {
fprintf(stderr, "%s\n", err.msg);
exit(1);
}
yyjson_val *root = yyjson_doc_get_root(doc);
yyjson_val *title = yyjson_obj_get(root, "title");
printf("title: %s\n", yyjson_get_str(title));
yyjson_val *entries = yyjson_obj_get(root, "entries");
size_t idx, max;
yyjson_val *entry;
yyjson_arr_foreach(entries, idx, max, entry) {
title = yyjson_obj_get(entry, "title");
printf("%s\n", yyjson_get_str(title));
}
yyjson_doc_free(doc);
return 0;
}
直感的で parson や jannson を使った事がある方であればどんな API かすぐに分かると思います。
ライセンスも MIT ですので業務で使う事もできますね。