simdjson :JSON每秒解析JSON
JSON无处不在互联网。服务器花费大量时间来解析它。我们需要一种新的方法。 simdjson库使用常用的SIMD指令和微相线算法来解析JSON 4倍的速度比Rapidjson快4倍,而现代C ++的JSON速度比JSON快25倍。
- 快速:超过4倍以上的速度超过常用的生产级JSON解析器。
- 记录破坏功能:以6 GB/s的速度缩小JSON,以13 GB/s验证UTF-8,NDJSON在3.5 GB/s处验证。
- 简单:一流,易于使用和仔细记录的API。
- 严格:完整的JSON和UTF-8验证,无损解析。没有妥协的性能。
- 自动:在运行时选择CPU量的解析器。无需配置。
- 可靠:从内存分配到错误处理, simdjson的设计避免了惊喜。
- 同行评审:我们的研究出现在VLDB期刊,软件:实践和经验等场所中。
该库是很棒的现代C ++列表的一部分。
目录
- 现实世界的用法
- 快速开始
- 文档
- Godbolt
- 性能结果
- 软件包
- simdjson的绑定和端口
- 关于simdjson
- 资金
- 为simdjson做出了贡献
- 执照
现实世界的用法
- node.js
- Clickhouse
- meta velox
- Google Pax
- 米尔维斯
- QuestDB
- Clang Build Analyzer
- Shopify Heapprofiler
- starrocks
- 微软鱼店
- 英特尔PCM
- 西瓜
- Apache Doris
- Dgraph
- UJRPC
- fastgltf
- 广阔的
- Ada-url
- Fastgron
- Wasmedge
- 朗德
- GREPTIMEDB
如果您打算在产品中使用simdjson ,请从我们的一个发行版中使用。
快速开始
simdjson库很容易使用单个.H和.CPP文件消耗。
-
先决条件:G ++(版本7或更高)或Clang ++(版本6或更高),以及带有命令行壳的64位系统(例如,Linux,MacOS,FreeBSD)。我们还支持Visual Studio和Xcode等编程环境,但需要不同的步骤。 Clang ++的用户可能需要指定C ++版本(例如C ++ -STD = C ++ 17),因为Clang ++倾向于在C ++ 98上默认。
-
将simdjson .H和simdjson .CPP与示例文件Twitter.json一起拉到目录中。您可以使用WGET实用程序下载它们:
simdjson .h https://raw.gith*ub*use*rcontent.com/simdjson/ simdjson /master/singleheader/ simdjson .cpp https://raw.gith*ub*use*rcontent.com/simdjson/ simdjson /master/jsonexamples/twitter.json\”>
wget https://raw.gith*ub*use*rcontent.com/simdjson/ simdjson /master/singleheader/ simdjson .h https://raw.gith*ub*use*rcontent.com/simdjson/ simdjson /master/singleheader/ simdjson .cpp https://raw.gith*ub*use*rcontent.com/simdjson/ simdjson /master/jsonexamples/twitter.json
-
创建QuickStart.cpp:
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;
}\”>
# 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及其API的概述。
- 构建器是如何使用simdjson有效编写JSON字符串的概述。
- 性能显示一些更高级的场景以及如何为他们调整。
- 实现选择描述了运行时CPU检测以及如何使用它。
- API包含自动生成的API文档。
Godbolt
一些用户可能希望与编译的组件一起浏览代码。您想查看以下示例列表:
- simdjson示例具有通过异常处理错误的错误
- simdjson示例带有错误而没有例外
性能结果
simdjson库的使用三四分之三的说明要比最先进的解析器Rapidjson使用。据我们所知, simdjson是第一个在商品处理器上以千兆字节(GB/s)运行的完全验证的JSON解析器。它可以在单个核心上每秒解析数百万个JSON文档。
下图代表GB/s中的解析速度,用于使用GNU GCC 10编译器(带有-O3标志)在Intel Skylake处理器(3.4 GHz)上解析各种文件。我们将加载和处理数据的基准上的最佳和最快的C ++库进行比较。 simdjson库提供完整的Unicode(UTF-8)验证和确切的数字解析。
simdjson库都提供高速,无论是处理微型文件(例如300个字节)还是较大的文件(例如3MB)。以下图显示了在3.4 GHz Skylake处理器上使用脚本生成的各种尺寸的合成文件的解析速度(GNU GCC 9,-O3)。
我们所有的实验都是可重现的。
对于NDJSON文件,我们的多线解析功能可以超过3 GB/s。
软件包
simdjson的绑定和端口
我们将“绑定”(仅包装C ++代码)和端口区分到另一种编程语言(重新实现所有内容)。
- Zippyjson: simdjson项目的Swift Bindings。
- Libpy_ simdjson :使用Libpy的simdjson的高速Python绑定。
- PY simdjson : simdjson项目的Python Bindings。
- CY simdjson : simdjson项目的高速Python绑定。
- simdjson -RS:生锈端口。
- simdjson -lust:Rust Wrapper(绑定)。
- simdjson Sharp:.net Core(绑定和完整端口)的C#版本。
- simdjson _nodejs: simdjson项目的node.js绑定。
- simdjson _PHP: simdjson项目的PHP绑定。
- simdjson _ruby: simdjson项目的Ruby Bindings。
- fast_jsonparser: simdjson项目的Ruby Bindings。
- simdjson -GO:使用Golang Assembly进行端口。
- RCPP simdjson :r绑定。
- simdjson _erlang:erlang绑定。
- simdjson E:Erlang绑定。
- Lua- simdjson :Lua Bindings。
- 爱马仕 – 杰森:哈斯克尔绑定。
- Zimdjson:Zig Port。
- Simdjzon:Zig端口。
- JSON-SIMD:Raku Bindings。
- json :: simd:perl绑定;功能齐全的JSON模块,该模块使用simdjson进行解码。
- Gemmajson:基于simdjson Bindings的Nim Json Parser。
- simdjson -Java:Java端口。
关于simdjson
simdjson库利用现代的微体系结构,与SIMD向量指令并行化,减少分支错误预测以及减少数据依赖性以利用每个CPU的多个执行核心。
我们的默认前端被称为按需,我们写了一篇论文:
- 约翰·凯泽(John Keizer),丹尼尔·莱米尔(Daniel Lemire),《按需JSON:更好的解析方法》?,软件:练习和经验54(6),2024年。
有些人喜欢阅读第一本(2019年) simdjson论文: simdjson的设计和实施的描述是我们的研究文章:
- 杰夫·兰代尔(Geoff Langdale),丹尼尔·莱米尔(Daniel Lemire),每秒解析JSON的千兆字节,VLDB Journal 28(6),2019年。
我们有一份有关UTF-8验证的深入论文:
- 约翰·凯泽(John Keizer),丹尼尔·莱米尔(Daniel Lemire),以每个字节的指令不到一个指令,软件:实践与体验51(5),2021,验证UTF-8。
我们还有一篇非正式的博客文章提供了一些背景和背景。
对于视频倾斜,
(这是最好的选票演讲,我们为此感到自豪。)
资金
这项工作得到了加拿大自然科学和工程研究委员会的支持,该委员会根据RGPIN-2017-03910和RGPIN-2024-03787提供了支持。
为simdjson做出了贡献
前往贡献.md,以获取有关simdjson贡献的信息,以及Hacking.MD以获取有关来源,建筑和建筑/设计的信息。
执照
此代码可根据Apache许可证2.0以及MIT许可证提供。作为用户,您可以选择自己喜欢的许可证。
在Windows下,我们使用Windows/dirent_portable.h文件(在我们的库代码之外)构建一些工具:它在自由(友好的)MIT许可下。
对于不支持C ++ 17的编译器,我们捆绑了按照Boost许可证发布的字符串视图库。像Apache许可证一样,Boost许可证是允许商业再分配的允许许可证。
为了有效的数字序列化,我们将Florian Loitsch用于二进制二进制的Grisu2算法的实现到十进制浮点数。 JSON对现代C ++库进行了稍微修改该实现。 Florian Loitsch的实施和现代C ++的JSON均在MIT许可下提供。
对于运行时派遣,我们使用了根据BSD授权的Pytorch项目中的一些代码。
