json在线解析(json是什么意思)

json在线解析(json是什么意思)最近GitHub开放了一个JSON解析器simdjson。对比其他常用解析器,结果显示simdjson的解析速度达到2.2GB/s,遥遥领先于其他解析器。下面,我们将为您详细介绍simdjson。以…

大家好,我是讯享网,很高兴认识大家。

最近GitHub开放了一个JSON解析器simdjson。对比其他常用解析器,结果显示simdjson的解析速度达到2.2GB/s,遥遥领先于其他解析器。下面,我们将为您详细介绍simdjson。以下是simdjson在GitHub上的文档。

JSON文档在互联网上无处不在,服务器花费大量时间解析这些文档。我们希望在充分验证(包括字符编码)的同时,尽可能使用通用的SIMD指令来加快JSON的解析速度。

一些性能结果

与最先进的解析器(如RapidJSON)相比,我们可能使用四分之一或更少的指令,只有sajson的一半。据我们所知,simdjson是第一个完全验证的json解析器,以每秒千兆字节的速度运行在商业处理器上。

在Skylake处理器上,各种解析器解析twitter.json文件的速度(以GB/s为单位)如下所示。

基本要求通过 Visual Studio 2017 或更高版本支持 Linux、macOS 以及 Windows 等平台;带有 AVX2 的处理器;支持最近的 C++ 编译器(例如,GNU GCC 或 LLVM CLANG 或 Visual Studio 2017),我们假设是 C++ 17,GNU GCC 7 或更高版本,或者 LLVM 的 clang 6 或更高版本;提供一些基准测试脚本,可以是 bash 和其他常用的实用命令程序,但是是可选的。许可

代码使用Apache License 2.0许可。

在Windows下,我们通过使用windows/dirent_portable.h文件(在我们的库代码之外)构建了一些工具:基于freedom的MIT license。

代码示例

复制代码

# include ” simdjson/JSON parser . h “/…const char * filename =…// //使用任何你想要的手段获取你的JSON documentsd::string _ view p = get _ corpus(filename)的一个字符串;ParsedJson pjpj . allocate capacity(p . size());//分配内存最多解析p . size()bytes bool is _ ok = JSON _ parse(p,pj);//进行解析,出错返回false解析完成!//可以安全删除字符串content free((void *)p . data());//这里可以使用解析后的JSON文档//JS可以和其他JSON _ parse调用一起重用。如果您不介意为每个新的JSON文档分配内存,也可以使用更简单的API:

复制代码

# include ” simdjson/JSON parser . h “/…const char * filename =…//std::string_view p = get_corpus(文件名);ParsedJson pj = build _ parsed _ JSON(p);//做解析//此时不再需要p,可以做aligned _ free((void *)p . data())if(!pj . is valid(){//Something went error }一个简单用法的头文件

可以看看头文件中代码库的“singleheader”和用法中的“_ demo.cpp”文件。这里不需要使用特定的构建系统:只需将文件复制到项目中的路径。然后,您可以包括它们:

复制代码

# include & ltiostream & gt# include ” SIMD JSON . h ” # include ” SIMD JSON . CPP ” int main(int argc,char * argv[]){ const char * filename = argv[1];std::string_view p = get_corpus(文件名);ParsedJson pj = build _ parsed _ JSON(p);//如果(!pj . is valid()){ STD::cout & lt;& lt“无效”& lt& ltSTD::endl;} else { STD::cout & lt;& lt”有效” & lt& ltSTD::endl;}返回EXIT _ SUCCESS}注意:在某些环境下,可能需要预编译simdjson.cpp,而不是包含它。

在Linux或macOS上使用旧的Makefile。

要求:最近的clang(或gcc)和make。我们建议至少使用GNU GCC/G ++ 7或LLVM clang 6,Linux或macOS系统。

测试:

复制代码

使测试运行基准测试:

复制代码

进行语法分析。/parsejsonexamples/Twitter . js在Linux上,parse命令提供了对性能计数器的详细分析。

运行其他基准测试进行比较(使用其他解析器):

复制代码

Make benchmark在Linux或macOS等平台上使用CMake。

要求:需要最新版本的cmake。在macOS上,安装cmake最简单的方法可能是使用brew。

复制代码

Brew install cmake你需要一个新的编译器比如clang或者gcc。我们建议至少使用GNU GCC/G ++ 7或LLVM clang 6。例如,您可以使用brew安装最新的编译器:

复制代码

Brew install gcc@8可选:你需要通过设置cc和CXX变量告诉cmake你想用哪个编译器。在bash中,可以使用export CC = gcc-7和exportcxx = g+7这样的命令。

构建:在项目代码库中执行以下命令:

复制代码

目录构建CD构建Cmake..Make Make将生成一个库。默认情况下,它会构建一个共享库(例如,http://xn-linuxlibsimdjson-uq 9 Yb 344 c . so/)。

您可以构建一个静态库:

复制代码

mkdir buildstaticcd buildstaticmake-dsimdjson _ build _ static = on..make make test在某些情况下,你可能想要指定一个编译器,尤其是当系统默认编译器太旧的时候。您可以遵循以下步骤:

复制代码

brew install gcc @ 8 mkdir build CD build export CXX = g++-8cc = gcc-8 cake..make make test通过Visual Studio在Windows上使用CMake

我们假设你有一台普通的Windows PC,至少安装了Visual Studio 2017,支持AVX2的x64处理器(2013 Haswell或更高)。

从 GitHub 获取 simdjson 代码,例如,使用 GitHub Desktop 克隆它。安装 CMake。在安装时,请确保可以从命令行使用 cmake。请选择最新版本的 cmake。在 simdjson 中创建一个子目录,例如 VisualStudio。在 shell 中转到这个新创建的目录。在 shell 中键入 cmake -DCMAKE_GENERATOR_PLATFORM=x64 …(或者,如果要构建 DLL,可以使用命令行 cmake -DCMAKE_GENERATOR_PLATFORM=x64 -DSIMDJSON_BUILD_STATIC=OFF …)。最后一个命令在新创建的目录(例如 simdjson.sln)中创建了一个 Visual Studio 解决方案文件。在 Visual Studio 中打开这个文件。你现在应该能够构建项目并运行测试。例如,在“Solution Explorer”窗口中,右键单击“ALL_BUILD”,并选择“Build”。要测试代码,仍然在 Solution Explorer 窗口中,选择 RUN_TESTS,再选择 Build。工具json2json mydoc.json 解析文档,构造模型,然后将结果输出到标准输出。json2json -d mydoc.json 解析文档,构造模型,然后将模型输出到标准输出。格式在随附的文件 tape.md 中有描述。minify mydoc.json 缩小 JSON 文档,将结果输出到标准输出。缩小意味着删除不必要的空格。范围

我们提供了一个非常快速的解析器。它根据各种规格完全验证输入。解析器为后续访问构建一个不可变(只读)的DOM(文档对象模型)。

为了简化项目,我们做了一些假设。

支持 UTF-8(以及 ASCII),没有别的(没有 Latin,没有 UTF-16)。我们不认为这是一个真正的限制,因为我们不认为会有哪个严肃的应用程序需要在没有 ASCII 或 UTF-8 编码的情况下处理 JSON 数据。我们将字符串存储为以 NULL 作为终止符的 C 字符串。因此,我们假设字符串中不包含 NULL 字符。我们假设支持 AVX2,这在 AMD 和英特尔生产的所有最新主流 x86 处理器中都可用。不支持非 x86 处理器,尽管我们可以支持。我们计划支持 ARM 处理器。如果发生故障,我们只会报告故障,而不会指出问题的性质。在规范允许的情况下,我们允许对象内存在重复的 key。性能针对跨越几千字节到几兆字节的 JSON 文档进行了优化:解析很多小型 JSON 文档和一个大 JSON 文档的性能问题是不一样的。

我们的目标不是提供一个通用的JSON库。像RapidJSON这样的库不仅提供解析功能,还可以用来生成JSON,并提供其他各种方便的功能。我们只解析文档。

特性不需改输入的字符串。(像 sajson 和 RapidJSON 这样的解析器使用输入字符串作为缓冲区。)将整数和浮点数解析为单独的类型,这样可以支持 [-9223372036854775808,9223372036854775808] 区间的 64 位整数,就像 Java 的 long 或 C/C++ 的 long long。在区分整数和浮点数的解析器中,并非所有解析器都支持 64 位整数。(例如,sajson 不支持包含大于或等于 2147483648 整数的 JSON 文件。FreeJSON 将长整数解析为浮点数。)当我们无法将整数表示为带符号的 64 位值时,我们就拒绝解析 JSON 文档。在解析过程中进行完整的 UTF-8 验证。(像 fastjson、gason 和 dropbox json11 这样的解析器不会进行 UTF-8 验证。)完全验证数字。(像 gason 和 ultranjson 这样的解析器会接受 [0e+] 这样的数字。)验证字符串内容中的未转义字符。(像 fastjson 和 ultrajson 这样的解析器接受字符串中未转义的换行符和制表符。)架构

解析器分为三个阶段:

阶段 1,(查找标记)快速标识结构元素、字符串等。我们在这个阶段验证 UTF-8 编码。阶段 2,(结构构建)构建排序的“树”(物化为磁带),以方便访问数据。我们在这个阶段解析字符串和数字。访问已解析的文档

以下是将解析的JSON转储回字符串的代码示例:

复制代码

ParsedJson::迭代器pjh(pj);如果(!pjh . isok()){ STD::cerr & lt;& lt”无法迭代解析的结果。”& lt& ltSTD::endl;返回EXIT _ FAILURE} compute _ dump(pj);// //其中compute_dump为:void compute _ dump(ParsedJson::iterator & amp;pjh){ if(pjh . is _ object()){ STD::cout & lt;& lt”{“;if(pjh . down()){ pjh . print(STD::cout);//必须是字符串STD::cout & lt;& lt”:”;pjh . next();compute _ dump(pjh);//让我们递归while(pjh . next()){ STD::cout & lt;& lt”,”;pjh . print(STD::cout);STD::cout & lt;& lt”:”;pjh . next();compute _ dump(pjh);//让我们递归} pjh . up();} STD::cout & lt;& lt”}”;} else if(pjh . is _ array()){ STD::cout & lt;& lt”[“;if(pjh . down()){ compute _ dump(pjh);//让我们递归while(pjh . next()){ STD::cout & lt;& lt”,”;compute _ dump(pjh);//让我们递归} pjh . up();} STD::cout & lt;& lt”]”;} else { pjh . print(STD::cout);//只打印唯一的值}}下面的函数会找出所有的user.id整数:

复制代码

void simdjson _ traverse(STD::vector & lt;int64 _ t & gt& amp迭代器& ampI){ switch(I . get _ type()){ case ‘ { ‘:if(I . down()){ do { bool found user = equals(I . get _ string(),” user “);I . next();//移动到值if(I . is _ object()){ if(found user & amp;& ampI . move _ to _ key(” id “){ if(I . is _ integer()){ answer . push _ back(I . get _ integer());} I . up();} simdjson_traverse(回答,我);} else if(I . is _ array()){ simdjson _ traverse(答案,I);} } while(I . next());I . up();}破;case ‘[‘:if(I . down()){ do { if(I . is _ object _ or _ array()){ simdjson _ traverse(answer,I);} } while(I . next());I . up();}破;大小写“l”:大小写“d”:大小写“n”:大小写“t”:大小写“f”:默认值:break}}深度比较如果您想知道各种解析器如何验证给定的JSON文件:

复制代码

生成allparserscheckfile。/allparserscheckfilemfile . JSON性能比较:

复制代码

搞解析比赛。/parsing competition myfile.json更广泛的比较:

复制代码

进行allparsingcompetition。/allparsingcompetition my file . JSON

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。
本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://51itzy.com/5914.html
(0)
上一篇 2024年 5月 2日 18:00
下一篇 2024年 5月 2日 18:51

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注