Simdjson:每秒解析千兆字节的JSON

2020-08-06 20:08:23

JSON在互联网上无处不在。服务器要花费“大量”时间来解析它。我们需要一个新鲜的方法。Simdjson库使用常用的SIMD指令和微并行算法来解析JSON,速度比其他任何东西都快2.5倍。先决条件:g++(版本7或更高版本)或clang++(版本6或更高版本),以及带命令行shell的64位系统(例如Linux、MacOS、FreeBSD)。我们还支持Visual Studio和Xcode等编程环境,但需要不同的步骤。

#include";simdjson.h";int main(Void){simdjson::DOM::Parser parser;simdjson::DOM::Element twets=parser。加载(";twitter.json";);std::cout<;<;twets[";Search_METADATA";][";count";]<;<;&34;结果。";<;<;std::Endl;}。

Simdjson库使用的指令比最先进的解析器RapidJSON少四分之三,比sajson少50%。据我们所知,simdjson是第一个在商用处理器上以每秒千兆字节(GB/s)的速度运行的完全验证的JSON解析器。它可以在单个内核上每秒解析数百万个JSON文档。

下图表示在英特尔Skylake处理器(3.4Ghz)上使用GNU GCC 9编译器(带-O3标志)解析各种文件时的解析速度(以GB/s为单位)。我们将其与最好、最快的C++库进行比较。Simdjson库提供完整的unicode(utf-8)验证和精确数字解析。RapidJSON库在两种模式下进行了测试:快速和快速的数字解析。Sajson库提供快速(但不精确)的数字解析和部分Unicode验证。在这个数据集中,文件大小从65KB(GitHub_Events)一直到3.3 GB(GSOC-2018)。许多文件大多由数字组成:加拿大、网格、网格、随机和数字:在这种情况下,由于数字解析成本较高,我们看到JSON解析速度较低。Simdjson库使用精确的数字解析,这特别繁琐。

在Skylake处理器上,各种处理器对twitter.json文件的解析速度(以GB/s为单位)如下,再次使用GNU GCC 9.1(带-O3标志)。流行的用于现代C++库的JSON特别慢:它显然牺牲了解析速度来换取其他所需的特性。

无论是处理小文件(例如,300字节)还是处理较大文件(例如,3MB),SIMDJSON库都提供高速。下图显示了在3.4GHzSkylake处理器(GNU GCC 9,-O3)上使用脚本生成的各种大小的合成文件的解析速度。

如果您计划在产品中使用simdjson,请使用我们的某个版本。

我们区分了绑定(仅包装C++代码)和到另一种编程语言的端口(重新实现所有内容)。

SIMDJSON库利用现代微体系结构,与SIMD矢量指令并行化,减少分支错误预测,并降低数据依赖性,以利用每个CPU的多个执行核心。

有些人喜欢阅读我们的论文:我们的研究文章描述了simdjson的设计和实现:Geoff Langdale,DanielLemire,Parsing Gigabytes of JSON per Second,VLDB Journal 28(6),2019年。

对于视频的倾向性,(这是投票最好的演讲,我们对此感到有点自豪)。

这项工作得到了加拿大自然科学和工程研究理事会的支持,编号为RGPIN2017-03910。

访问CONTRIBUTING.md获取有关为SIMDJSON做出贡献的信息,访问HACKING.md获取有关源、建筑和架构/设计的信息。

在Windows下,我们使用windows/dirent_portable.h文件(不在我们的库代码中)构建一些工具:它遵循自由(商业友好)MIT许可。

对于不支持C++17的编译器,我们捆绑了在Boost许可证(http://www.boost.org/LICENSE_1_0.txt).)下发布的字符串视图库。与Apache许可一样,Boost许可也是允许商业再分发的许可。