JSON 在互联网上随处可见。服务器需要花费大量时间来解析它。我们需要一种全新的方法。
simdjson 库使用常见的 SIMD 指令和微并行算法,
使其解析 JSON 的速度比 RapidJSON 快 4 倍,比现代 C++ 的 JSON 快 25 倍。
该库是 Awesome Modern C++ 列表的一部分。
simdjson 库只需一个 .h 和 .cpp 文件即可轻松使用。
g++
(版本 7 或更高版本)或 clang++
(版本 6 或更高版本),以及带有命令行 shell 的 64 位c++ -std=c++17
),因为 clang++ 通常默认使用 C++98。wget https://raw.githubusercontent.com/simdjson/simdjson/master/singleheader/simdjson.h https://raw.githubusercontent.com/simdjson/simdjson/master/singleheader/simdjson.cpp https://raw.githubusercontent.com/simdjson/simdjson/master/jsonexamples/twitter.json
quickstart.cpp
:#include <iostream>
#include "simdjson.h"
using namespace simdjson;
int main(void) {
ondemand::parser parser;
padded_string json = padded_string::load("twitter.json");
ondemand::document tweets = parser.iterate(json);
std::cout << uint64_t(tweets["search_metadata"]["count"]) << " results." << std::endl;
}
c++ -o quickstart quickstart.cpp simdjson.cpp
./quickstart
100 results.
可用的使用文档包括:
有些用户可能希望同时浏览编译后的汇编代码。您可以查看以下示例列表:
simdjson 库使用的指令比最先进的解析器 RapidJSON 少四分之三。据我们所知,simdjson 是第一个在商用处理器上以 千兆字节/秒 (GB/s) 速度运行的完全验证 JSON 解析器。它可以在单核上每秒解析数百万个 JSON 文档。
下图表示在 Intel Skylake 处理器 (3.4 GHz) 上使用 GNU GCC 10 编译器(带有 -O3 标志)解析各种文件的解析速度(以 GB/s 为单位)。
我们在加载和处理数据的基准测试中,将其与最佳和最快的 C++ 库进行了比较。
simdjson 库提供完整的 Unicode (UTF-8) 验证和精确数字解析。
simdjson 库无论处理小文件(例如 300 字节)还是大文件(例如 3MB),都能提供高速处理。下图展示了在 3.4 GHz Skylake 处理器(GNU GCC 9,-O3)上,使用脚本生成的各种大小的合成文件 的解析速度。
对于 NDJSON 文件,我们可以使用 我们的多线程解析函数 实现超过 3 GB/s 的速度。
我们区分“绑定”(仅包装 C++ 代码)和移植到其他编程语言(重新实现所有内容)。
simdjson 库充分利用现代微架构的优势,与 SIMD 矢量指令并行执行,
减少分支预测错误,并降低数据依赖性,从而充分利用每个 CPU 的多个执行核心。
我们的默认前端称为 On-Demand,我们撰写了一篇关于它的论文:
有些人喜欢阅读第一篇 (2019) simdjson 论文:simdjson 的设计
和实现描述在我们的研究文章中:
我们有一篇深入探讨 UTF-8 验证的论文:
我们还发布了一篇非正式的博客文章,提供了一些背景和上下文。
此代码遵循 Apache 许可证 2.0 和 MIT 许可证。作为用户,您可以选择您喜欢的许可证。
在 Windows 下,我们使用 windows/dirent_portable.h 文件(该文件不在我们的库代码范围内)构建了一些工具:该文件遵循自由(商业友好型)MIT 许可证。
对于不支持 C++17 的编译器,我们捆绑了遵循 Boost 许可证 发布的字符串视图库。与 Apache 许可证一样,Boost 许可证是一种宽松的许可证,允许商业再分发。
为了实现高效的数字序列化,我们捆绑了 Florian Loitsch 的 Grisu2 算法实现,该算法用于二进制到十进制浮点数的转换。该实现由 JSON for Modern C++ 库进行了略微修改。Florian Loitsch 的实现和 JSON for Modern C++ 均遵循 MIT 许可证。
对于运行时调度,我们使用了 PyTorch 项目的一些代码,这些代码遵循 3-clause BSD 许可证。