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

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

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

我们将整数和浮点数解析为单独的类型,这允许我们支持[-9223372036854775808,9223372036854775808]中的大型64位整数,如Java long 或C / C ++ long long 。在区分整数和浮点数的解析器中,并非所有解析器都支持64位整数。(例如,sajson拒绝整数大于或等于2147483648的JSON文件.FreeJSON将解析包含过长整数的文件,如18446744073709551616作为浮点数)当我们无法将整数表示为带符号的64位时值,我们拒绝JSON文档。

在解析过程中进行完整的UTF-8验证(像fastjson,gason和dropbox json11这样的解析器不会进行UTF-8验证);完全验证了这些数字(像gason和ultranjson这样的解析器将接受 [0e+] 为有效的JSON);验证未转义字符的字符串内容(像fastjson和ultrajson这样的解析器接受未转义的换行符和字符串中的标签)。

Architecture

解析器分两个阶段工作:

阶段1.(查找标记)快速标识结构元素,字符串等。我们在那个阶段验证UTF-8编码。

阶段2.(结构构建)涉及构建排序的“树”(具体化为磁带)以浏览数据。在此阶段解析字符串和数字。

导航已解析的文档

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

  1. ParsedJson::iterator pjh(pj); 
  2.     if (!pjh.isOk()) { 
  3.       std::cerr << " Could not iterate parsed result. " << std::endl; 
  4.       return EXIT_FAILURE; 
  5.     } 
  6.     compute_dump(pj); 
  7.     // 
  8.     // where compute_dump is : 
  9.  
  10. void compute_dump(ParsedJson::iterator &pjh) { 
  11.   if (pjh.is_object()) { 
  12.     std::cout << "{"; 
  13.     if (pjh.down()) { 
  14.       pjh.print(std::cout); // must be a string 
  15.       std::cout << ":"; 
  16.       pjh.next(); 
  17.       compute_dump(pjh); // let us recurse 
  18.       while (pjh.next()) { 
  19.         std::cout << ","; 
  20.         pjh.print(std::cout); 
  21.         std::cout << ":"; 
  22.         pjh.next(); 
  23.         compute_dump(pjh); // let us recurse 
  24.       } 
  25.       pjh.up(); 
  26.     } 
  27.     std::cout << "}"; 
  28.   } else if (pjh.is_array()) { 
  29.     std::cout << "["; 
  30.     if (pjh.down()) { 
  31.       compute_dump(pjh); // let us recurse 
  32.       while (pjh.next()) { 
  33.         std::cout << ","; 
  34.         compute_dump(pjh); // let us recurse 
  35.       } 
  36.       pjh.up(); 
  37.     } 
  38.     std::cout << "]"; 
  39.   } else { 
  40.     pjh.print(std::cout); // just print the lone value 
  41.   } 

(编辑:江门站长网)

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