每秒千兆字节的 C++ 中的基于反射的 JSON - Daniel Lemire 的博客

主要观点:

  • JSON 是存储和传输数据的流行格式,其解析可能是性能瓶颈,一些 JSON 解析器可高速处理 JSON。
  • 在 C++中生成和摄入 JSON 数据较繁琐,需处理潜在错误,常需将内容映射到本地数据结构。
  • 像 simdjson 库可实现优雅的反序列化,但程序员需编写自定义函数。
  • C++即将在 C++26 中获得强大的反射功能,可自动实现 JSON 与原生数据结构的转换,简化程序员工作,提高代码性能和安全性。
  • 目前的 C++编译器虽不支持反射,但有原型编译器可用于测试性能,新的 C++特性可使序列化和反序列化数据结构速度提升约 20 倍。

关键信息:

  • JSON 格式以属性-值对和数组形式表示结构化数据,如{"age":5, "name":"Daniel", toys:["wooden dog", "little car"]}。
  • 在 C++中可通过 kid 结构体表示 JSON 数据,如 struct kid { int age; std::string name; std::vector<std::string> toys; }。
  • simdjson 库可进行反序列化,如 struct kid { int age; std::string name; std::vector<std::string> toys; },void demo() {... } 示例。
  • 从 C++结构到 JSON 需编写自定义代码,如 in nlohmann/json 库中 void to_json(json&j, const person&p) {... } 和 void from_json(const json&j, person&p) {... }。
  • C++26 的反射功能可自动实现 JSON 与原生数据结构的转换,如 kid k{12, "John", {"car", "ball"}}; std::print("My JSON is {}\n", simdjson::json_builder::to_json_string(k));。
  • 基准测试显示新的 C++特性比 nlohmann/json 快约 20 倍,通过结合反射能力和一些技巧实现,且与手写代码和现有反射库相比有优势。

重要细节:

  • 提到许多编程语言有反射,但即将推出的 C++标准的反射元编程是独特的,一些语言的反射能力主要是运行时特征,不允许生成代码,而其他语言允许编译时逻辑生成但不一定有最佳性能,预计 C++方法适合高性能。
  • 用于测试的原型是在 Bloomberg 维护的 LLVM 叉上编写的,虽不能用于生产,但可测试性能,且不关心编译速度。
  • 代码示例展示了如何使用 simdjson 库进行 JSON 与 kid 结构体的转换及相关操作,还给出了参考文献。
阅读 55
0 条评论