成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

新聞 開發工具
JSON文檔在Internet上無處不在,服務器花費大量時間來解析這些文檔。我們希望在進行完全驗證(包括字符編碼)時盡可能使用常用的SIMD指令來加速JSON本身的解析。

 JSON文檔在Internet上無處不在,服務器花費大量時間來解析這些文檔。我們希望在進行完全驗證(包括字符編碼)時盡可能使用常用的SIMD指令來加速JSON本身的解析。

表現結果

simdjson使用的指令比解析器RapidJSON少四分之三,比sajson少百分之五十。據我們所知,simdjson是一個在商用處理器上以每秒千兆字節運行的完全驗證的JSON解析器。

在Skylake處理器上,twitter.json文件上各種處理器的解析速度(以GB / s為單位)如下。

解析器 GB /秒
simdjson 2.2
RapidJSON編碼驗證 0.51
RapidJSON編碼驗證,原位 0.71
sajson(原狀,動態) 0.70
sajson(insitu,static) 0.97
dropbox 0.14
FASTJSON 0.26
gason 0.85
ultrajson 0.42
jsmn 0.28
cJSON 0.34

要求

我們通過Visual Studio 2017或更高版本支持Linux或macOS等平臺以及Windows;

帶有高級矢量擴展指令集的處理器(即,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; 

我們需高級矢量擴展指令集指令的硬件支持。您必須確保指示編譯器根據需要使用這些說明。在GNU GCC或LLVM clang等編譯器下, -march=native 最近的Intel處理器(Haswell或更好)上使用的標志就足夠了。為了便于二進制文件的可移植性,您還可以直接指定Haswell處理器( -march=haswell )。

注意:在某些設置中,可能需要預編譯 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也可以以相同的方式工作 。

你需要一個像clang或gcc這樣的新編譯器。我們建議至少使用GNU GCC / G ++ 7或LLVM clang 6.例如,您可以使用brew安裝新的編譯器:

  1. brew install gcc@8 

可選:您需要通過設置CC和CXX變量告訴cmake您希望使用哪個編譯器。bash下,你可以用諸如命令這樣做 export CC=gcc-7 和 export CXX=g++-7 。

構建:在項目存儲庫中,執行以下操作:

  1. mkdir build 
  2. cd build 
  3. cmake .. 
  4. make 
  5. make test 

默認情況下,它構建一個共享庫(例如,Linux上的libsimdjson.so)。

您可以構建一個靜態庫:

  1. mkdir buildstatic 
  2. cd buildstatic 
  3. cmake -DSIMDJSON_BUILD_STATIC=ON .. 
  4. make 
  5. make test 

在某些情況下,您可能希望指定編譯器,尤其是在系統上的默認編譯器太舊的情況下。您可以按以下步驟操作:

  1. brew install gcc@8 
  2. mkdir build 
  3. cd build 
  4. export CXX=g++-8 CC=gcc-8 
  5. cmake .. 
  6. make 
  7. make test 

用法(使用Visual Studio在Windows上進行CMake)

我們假設您有一臺普通的Windows PC,至少包含Visual Studio 2017和支持高級矢量擴展指令集的x64處理器(2013 Intel Haswell或更高版本)。

從GitHub獲取simdjson代碼,例如,使用 GitHub Desktop 克隆它;

安裝 CMake 。安裝時,請確保 cmake 從命令行詢問是否可用。請選擇新版本的cmake;

在simdjson中創建一個子目錄,例如 VisualStudio;

使用shell,轉到這個新創建的目錄;

cmake -DCMAKE_GENERATOR_PLATFORM=x64 .. 在 VisualStudio 存儲庫中鍵入shell 。(或者,如果要構建DLL,可以使用命令行 cmake -DCMAKE_GENERATOR_PLATFORM=x64 -DSIMDJSON_BUILD_STATIC=OFF .. )

末尾一個命令在新創建的目錄中創建了一個Visual Studio解決方案文件(例如 simdjson.sln)。在Visual Studio中打開此文件。您現在應該能夠構建項目并運行測試。例如,在 Solution Explorer 窗口(可從 View 菜單中獲得)中,右鍵單擊 ALL_BUILD 并選擇 Build 。要測試代碼,仍然在 Solution Explorer 窗口中,選擇 RUN_TESTS 并選擇 Build 。

用法(在Windows,Linux和MacOS上使用vcpkg)

Windows,Linux和MacOS上的 vcpkg 用戶可以 simdjson 使用他們喜歡的shell中的一個命令下載和安裝。

在Linux和MacOS上:

  1. $ ./vcpkg install simdjson 

將構建并安裝 simdjson 為靜態庫。

在Windows(64位)上:

  1. .\vcpkg.exe install simdjson:x64-windows 

將構建并安裝 simdjson 為共享庫。

  1. .\vcpkg.exe install simdjson:x64-windows-static 

將構建并安裝 simdjson 為靜態庫。

這些命令還將打印出有關如何使用MSBuild或基于CMake的項目庫的說明。

如果您發現 simdjson 附帶的版本 vcpkg 已過期,請隨時通過提交 vcpkg 問題或創建PR 向社區報告。

工具

json2json mydoc.json 解析文檔,構造模型,然后將結果轉儲回標準輸出

json2json -d mydoc.json 解析文檔,構造模型,然后將模型(作為磁帶)轉儲到標準輸出。磁帶格式在隨附文件中描述 tape.md

minify mydoc.json`縮小JSON文檔,將結果輸出到標準輸出。縮小意味著刪除不需要的空格字符。

范圍

我們提供快速解析器。它根據各種規格完全驗證輸入。解析器構建一個有用的不可變(只讀)DOM(文檔 – 對象模型),以后可以訪問它。

為了簡化工程,我們做了一些假設:

我們支持UTF-8(以及ASCII),沒有別的(沒有拉丁語,沒有UTF-16)。我們不認為這是一個真正的限制,因為我們認為沒有任何嚴重的應用程序需要在沒有ASCII或UTF-8編碼的情況下處理JSON數據;

JSON文檔中的所有字符串最多可包含UTF-8(4GB)中的4294967295個字節。要強制執行此約束,我們拒絕解析包含超過4294967295字節(4GB)的文檔。這應該適應大多數JSON文檔;

我們假設高級矢量擴展指令集支持在AMD和英特爾生產的所有主流x86處理器中都可用。盡管可以完成,但不包括對非x86處理器的支持。我們計劃支持ARM處理器(請求幫助);

如果發生故障,我們只會報告故障,而不會指出問題的性質。(這可以在不影響性能的情況下輕松改進);

在規范允許的情況下,我們允許對象內的重復鍵(像sajson這樣的其他解析器也這樣做);

性能針對跨越至少幾十千字節到幾兆字節的JSON文檔進行了優化:必須解析許多小型JSON文檔或一個真正龐大的JSON文檔的性能問題是不同的。

我們的目標不是提供通用的JSON庫。像RapidJSON這樣的庫提供的不僅僅是解析,它還可以幫助您生成JSON并提供各種其他方便的功能。我們只解析文檔。

特征

輸入字符串未修改,(像sajson和RapidJSON這樣的解析器使用輸入字符串作為緩沖區)。

我們將整數和浮點數解析為單獨的類型,這允許我們支持[-9223372036854775808,9223372036854775808]中的大型64位整數,如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.   } 

以下函數將查找所有user.id整數:

  1. void simdjson_traverse(std::vector<int64_t> &answer, ParsedJson::iterator &i) { 
  2.   switch (i.get_type()) { 
  3.   case '{'
  4.     if (i.down()) { 
  5.       do { 
  6.         bool founduser = equals(i.get_string(), "user"); 
  7.         i.next(); // move to value 
  8.         if (i.is_object()) { 
  9.           if (founduser && i.move_to_key("id")) { 
  10.             if (i.is_integer()) { 
  11.               answer.push_back(i.get_integer()); 
  12.             } 
  13.             i.up(); 
  14.           } 
  15.           simdjson_traverse(answer, i); 
  16.         } else if (i.is_array()) { 
  17.           simdjson_traverse(answer, i); 
  18.         } 
  19.       } while (i.next()); 
  20.       i.up(); 
  21.     } 
  22.     break
  23.   case '['
  24.     if (i.down()) { 
  25.       do { 
  26.         if (i.is_object_or_array()) { 
  27.           simdjson_traverse(answer, i); 
  28.         } 
  29.       } while (i.next()); 
  30.       i.up(); 
  31.     } 
  32.     break
  33.   case 'l'
  34.   case 'd'
  35.   case 'n'
  36.   case 't'
  37.   case 'f'
  38.   default
  39.     break
  40.   } 

深入比較

如果您想了解各種解析器如何驗證給定的JSON文件:

  1. make allparserscheckfile 
  2. ./allparserscheckfile myfile.json 

對于性能比較:

  1. make parsingcompetition 
  2. ./parsingcompetition myfile.json 

進行更廣泛的比較:

  1. make allparsingcompetition 
  2. ./allparsingcompetition myfile.json 

 

責任編輯:張燕妮 來源: freebuf
相關推薦

2013-07-29 09:36:05

100G傳輸100G

2012-04-17 13:12:48

2010-03-04 10:20:59

超高速寬帶谷歌市

2025-04-27 03:22:00

2014-09-04 16:40:17

FTTx

2021-03-08 17:09:14

5G網絡俄羅斯

2016-12-28 17:04:51

1Gbps寬帶‘網絡

2014-02-18 09:19:04

LTE100G400G

2023-08-31 14:24:06

5G技術物聯網

2010-03-08 10:52:29

思科超高速互聯網接入系統

2009-07-09 11:19:01

2009-08-18 17:14:47

100G超高速以太網

2010-03-10 09:29:54

寬帶超高速互聯網思科

2015-01-05 15:11:23

日本光纖400Gbit

2017-07-11 06:23:50

數據中心互聯網球經濟

2015-08-18 15:13:10

2010-02-24 09:07:55

思科Cisco超高速互聯網

2009-02-04 09:37:14

超高速網絡下一代寬帶

2011-05-25 15:34:17

jQueryJSON

2024-11-25 12:00:00

C#日志記錄器
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 一本一道久久a久久精品蜜桃 | 亚洲一区二区三区免费视频 | 久久久久免费精品国产 | 久久国产亚洲 | 毛片a级毛片免费播放100 | 毛片一区二区 | 特黄特色大片免费视频观看 | 成人精品一区二区三区中文字幕 | 午夜在线| 玖玖综合网 | 欧洲精品一区 | 国产精品久久久久免费 | 奇米四色影视 | 国产精品免费一区二区三区四区 | 亚洲av一级毛片 | 99久热在线精品视频观看 | 免费人成在线观看网站 | 亚洲国产欧美精品 | 一区精品国产欧美在线 | 免费一区 | 精品三区 | 成人精品一区二区 | 国产午夜精品久久久 | 国产精品福利视频 | 欧美a区 | 亚洲一区二区在线播放 | 国产精品久久久久久久久久久免费看 | 精品久久精品 | 国产成人精品一区二区三区四区 | 亚洲97| 亚洲免费精品 | 成人综合一区 | 成人精品一区二区三区四区 | 国产精品福利视频 | 国产日韩欧美精品一区二区 | 色综合久久天天综合网 | 国产福利小视频 | 日本aa毛片a级毛片免费观看 | 久久一区二区三区四区 | 国产一区二区 | 国产一在线 |