副标题[/!--empirenews.page--]
JSON文档在Internet上无处不在,服务器花费大量时间来解析这些文档。我们希望在进行完全验证(包括字符编码)时尽可能使用常用的SIMD指令来加速JSON本身的解析。
表现结果
simdjson使用的指令比最先进的解析器RapidJSON少四分之三,比sajson少百分之五十。据我们所知,simdjson是第一个在商用处理器上以每秒千兆字节运行的完全验证的JSON解析器。
在Skylake处理器上,twitter.json文件上各种处理器的解析速度(以GB / s为单位)如下。
要求
我们通过Visual Studio 2017或更高版本支持Linux或macOS等平台以及Windows;
带有AVX2的处理器(即,2013年发布的Haswell微体系结构的Intel处理器和2017年发布的Zen微体系结构的AMD处理器);
最近的C ++编译器(例如,GNU GCC或LLVM CLANG或Visual Studio 2017),我们假设C ++ 17。GNU GCC 7或更高版本或LLVM的clang 6或更高版本。
License
此代码在Apache License 2.0下提供。
在Windows下,我们使用 windows/dirent_portable.h 文件(在我们的库代码之外)构建一些工具
代码示例
- #include "simdjson/jsonparser.h"
-
- /...
-
- const char * filename = ... //
-
- //使用您想要的任何方式获取JSON文档的字符串
- std::string_view p = get_corpus(filename);
- ParsedJson pj;
- pj.allocateCapacity(p.size());//分配内存以解析p.size()字节
- const int res = json_parse(p, pj); //进行解析,成功时返回0
- //解析完成!
- if(res!= 0){
- //您可以使用“simdjson / simdjson.h”标头来访问错误消息
- std::cout << "Error parsing:" << simdjson::errorMsg(res) << std::endl;
- }
- //你可以安全地删除字符串内容
- free((void*)p.data());
- //可以在这里使用ParsedJson文档
- // js可以与其他json_parse调用一起使用。
如果您不介意为每个新的JSON文档分配内存开销,也可以使用更简单的API:
- #include "simdjson/jsonparser.h"
-
- / ...
-
- const char * filename = ... //
- std::string_view p = get_corpus(filename);
- ParsedJson pj = build_parsed_json(p); //进行解析
- //此时你不再需要p,可以执行aligned_free((void *)p.data())
- if( ! pj.isValid() ) {
- //出错了
- }
用法:简单的版本
有关用法,请参阅“singleheader”存储库的文件“amalgamation_demo.cpp”。这不需要特定的构建系统:只需在包含路径中复制项目中的文件即可。然后,您可以非常简单地包含它们:
- #include <iostream>
- #include "simdjson.h"
- #include "simdjson.cpp"
- int main(int argc, char *argv[]) {
- const char * filename = argv[1];
- std::string_view p = get_corpus(filename);
- ParsedJson pj = build_parsed_json(p); // do the parsing
- if( ! pj.isValid() ) {
- std::cout << "not valid" << std::endl;
- } else {
- std::cout << "valid" << std::endl;
- }
- return EXIT_SUCCESS;
- }
我们需要AVX2指令的硬件支持。您必须确保指示编译器根据需要使用这些说明。在GNU GCC或LLVM clang等编译器下, -march=native 最近的Intel处理器(Haswell或更好)上使用的标志就足够了。为了便于二进制文件的可移植性,您还可以直接指定Haswell处理器( -march=haswell )。您也可以使用标志 -mavx2 -mbmi2 。在Visual Studio下,您需要定位x64并添加标志 /arch:AVX2 。
注意:在某些设置中,可能需要预编译 simdjson.cpp 而不是包含它。
用法(在Linux或macOS等平台上使用旧版Makefile)
要求:最近的clang或gcc,和make。我们建议至少使用GNU GCC / G ++ 7或LLVM clang 6.需要像Linux或macOS这样的系统。
测试:
- make
- make test
要运行基准测试:
- make parse
- ./parse jsonexamples/twitter.json
在Linux下,该 parse 命令提供了性能计数器的详细分析。
运行比较基准测试(与其他解析器):
- make benchmark
用法(在Linux或macOS等平台上使用CMake)
要求:我们需要最新版本的cmake。在macOS上,安装cmake的最简单方法可能是使用 brew然后键入
- brew install cmake
在Linux上 有一个 相同的Brew也可以以相同的方式工作 。
(编辑:南平站长网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|