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

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

发布时间:2019-03-25 17:45:55 所属栏目:建站 来源:周大涛编译
导读: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也可以以沟通的方法事变 。

(编辑:湖南网)

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

热点阅读