Simdjson每秒解析数GB的JSON数据的库

simdjson:每秒解析数 GB 的 JSON

JSON 在互联网上随处可见。服务器需要花费大量时间来解析它。我们需要一种全新的方法。
simdjson 库使用常见的 SIMD 指令和微并行算法,
使其解析 JSON 的速度比 RapidJSON 快 4 倍,比现代 C++ 的 JSON 快 25 倍。

功能

  • 快速:比常用的生产级 JSON 解析器快 4 倍以上。
  • 破纪录的功能:JSON 压缩速度达 6 GB/s,UTF-8 验证速度达 13 GB/s,NDJSON 解析速度达 3.5 GB/s。
  • 简单:一流、易用且文档齐全的 API。
  • 严格:完整的 JSON 和 UTF-8 验证,无损解析。性能丝毫不受影响。
  • 自动:运行时自动选择 CPU 定制的解析器,无需配置。
  • 可靠:从内存分配到错误处理,simdjson 的设计避免了意外。
  • 同行评审:我们的研究成果发表于《VLDB 期刊》、《软件:实践与经验》等期刊。

该库是 Awesome Modern C++ 列表的一部分。

快速入门

simdjson 库只需一个 .h 和 .cpp 文件即可轻松使用。

  1. 先决条件:g++(版本 7 或更高版本)或 clang++(版本 6 或更高版本),以及带有命令行 shell 的 64 位
    系统(例如 Linux、macOS、freeBSD)。我们也支持 Visual Studio 和 Xcode 等编程环境,但步骤有所不同。clang++ 用户可能需要指定 C++ 版本(例如 c++ -std=c++17),因为 clang++ 通常默认使用 C++98。
  2. simdjson.hsimdjson.cpp 以及示例文件 twitter.json 拖放到一个目录下。您可以使用“wget”实用程序下载它们:
复制代码
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
  1. Create quickstart.cpp:
c++ 复制代码
#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;
}
  1. c++ -o quickstart quickstart.cpp simdjson.cpp
  2. ./quickstart
复制代码
 100 results.

文档

可用的使用文档包括:

  • 基础知识 概述了如何使用 simdjson 及其 API。
  • 构建器 概述了如何使用 simdjson 高效地编写 JSON 字符串。
  • 性能 展示了一些更高级的场景以及如何针对这些场景进行调优。
  • 实现选择 描述了运行时 CPU 检测以及
    如何使用它。
  • API 包含自动生成的 API 文档。

Godbolt

有些用户可能希望同时浏览编译后的汇编代码。您可以查看以下示例列表:

性能结果

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 的速度。

simdjson 的绑定和端口

我们区分“绑定”(仅包装 C++ 代码)和移植到其他编程语言(重新实现所有内容)。

关于 simdjson

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 许可证。

关于项目

simdjson 库使用常见的 SIMD 指令和微并行算法,解析 JSON 的速度比 RapidJSON 快 4 倍,比现代 C++ 的 JSON 快 25 倍。
Apache-2.0
C++
22,535
1163
245
2018-03-23
2025-10-11

增长趋势 - stars