加入收藏 | 设为首页 | 会员中心 | 我要投稿 南平站长网 (https://www.0599zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 运营中心 > 建站资源 > 优化 > 正文

Simdjson:一个超高速的JSON解析工具

发布时间:2019-03-26 18:44:32 所属栏目:优化 来源:周大涛编译
导读:副标题#e# JSON文档在Internet上无处不在,服务器花费大量时间来解析这些文档。我们希望在进行完全验证(包括字符编码)时尽可能使用常用的SIMD指令来加速JSON本身的解析。 表现结果 simdjson使用的指令比最先进的解析器RapidJSON少四分之三,比sajson少百
副标题[/!--empirenews.page--]

JSON文档在Internet上无处不在,服务器花费大量时间来解析这些文档。我们希望在进行完全验证(包括字符编码)时尽可能使用常用的SIMD指令来加速JSON本身的解析。

表现结果

simdjson使用的指令比最先进的解析器RapidJSON少四分之三,比sajson少百分之五十。据我们所知,simdjson是第一个在商用处理器上以每秒千兆字节运行的完全验证的JSON解析器。

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 文件(在我们的库代码之外)构建一些工具

代码示例
  1. #include "simdjson/jsonparser.h" 
  2.  
  3. /... 
  4.  
  5. const char * filename = ... // 
  6.  
  7. //使用您想要的任何方式获取JSON文档的字符串 
  8. std::string_view p = get_corpus(filename); 
  9. ParsedJson pj; 
  10. pj.allocateCapacity(p.size());//分配内存以解析p.size()字节 
  11. const int res = json_parse(p, pj); //进行解析,成功时返回0  
  12. //解析完成! 
  13. if(res!= 0){ 
  14.      //您可以使用“simdjson / simdjson.h”标头来访问错误消息  
  15.    std::cout << "Error parsing:" << simdjson::errorMsg(res) << std::endl; 
  16. //你可以安全地删除字符串内容 
  17. free((void*)p.data()); 
  18. //可以在这里使用ParsedJson文档 
  19. // js可以与其他json_parse调用一起使用。 

如果您不介意为每个新的JSON文档分配内存开销,也可以使用更简单的API:

  1. #include "simdjson/jsonparser.h" 
  2.  
  3. / ... 
  4.  
  5. const char * filename = ... // 
  6. std::string_view p = get_corpus(filename); 
  7. ParsedJson pj = build_parsed_json(p);  //进行解析 
  8. //此时你不再需要p,可以执行aligned_free((void *)p.data()) 
  9. if( ! pj.isValid() ) { 
  10.      //出错了  
用法:简单的版本

有关用法,请参阅“singleheader”存储库的文件“amalgamation_demo.cpp”。这不需要特定的构建系统:只需在包含路径中复制项目中的文件即可。然后,您可以非常简单地包含它们:

  1. #include <iostream> 
  2. #include "simdjson.h" 
  3. #include "simdjson.cpp" 
  4. int main(int argc, char *argv[]) { 
  5.   const char * filename = argv[1]; 
  6.   std::string_view p = get_corpus(filename); 
  7.   ParsedJson pj = build_parsed_json(p); // do the parsing 
  8.   if( ! pj.isValid() ) { 
  9.     std::cout << "not valid" << std::endl; 
  10.   } else { 
  11.     std::cout << "valid" << std::endl; 
  12.   } 
  13.   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这样的系统。

测试:

  1. make 
  2. make test 

要运行基准测试:

  1. make parse 
  2. ./parse jsonexamples/twitter.json 

在Linux下,该 parse 命令提供了性能计数器的详细分析。

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

  1. make benchmark 
用法(在Linux或macOS等平台上使用CMake)

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

  1. brew install cmake 

在Linux上 有一个 相同的Brew也可以以相同的方式工作 。

(编辑:南平站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读