Contents
JSON 在網際網路上無處不在。 伺服器花費大量時間解析它。 我們需要一個新的方法。 Simdjson 程式庫使用通用的 SIMD 指令和微平行( microparallel )演算法來解析 JSON ,比其他任何程式庫都要快
具有以下特性
- 快速: 比其他營運等級的 JSON 解析器快 4 倍以上
- 簡單: First-class,易於使用的 API
- 嚴格: 完整的 JSON 和 UTF-8 驗證,無損解析。效能沒有折衷
- 自動: 在執行時選擇一個 CPU-tailored 的解析器。不需要配置
- 可靠: 從記憶體分配到錯誤處理,simdjson 的設計避免了意外
這個程式庫是 Awesome Modern C++ 列表的一部分。
效能結果
Simdjson 程式庫使用的指令比最先進的解析器 RapidJSON 少四分之三,比 sajson 少50% 。 據我們所知,simdjson 是第一個在普通處理器上以每秒千兆位元組執行的完全驗證 JSON 解析器。 它可以在單核上每秒解析數百萬個 JSON 檔案。
下圖表示使用 GNU GCC 9 編譯器(帶有 -O3 旗標)在 Intel Skylake 處理器(3.4 GHz)上解析各種檔案的解析速度(gb / s)。 我們比較了最好和最快的 C++ 程式庫。 Simdjson 程式庫提供了完整的 unicode (UTF-8)驗證和精確的數字解析。 Rapidjson 程式庫以兩種模式進行測試: 快速和準確的數字解析。 Sajson 庫提供了快速的(但不是精確的)數字解析和部分 unicode 驗證。 在這個資料集中,檔案大小從65KB (github_events)到3.3 GB (gsoc-2018)不等。 許多檔案主要是由數字組成的: canada、 mesh.pretty、 mesh、 random 和 numbers: 在這種情況下,由於數字解析的高成本,我們看到 JSON 解析速度較低。 Simdjson 程式庫使用精確數字解析,這是特別費力的。

在 Skylake 處理器上,twitter.json 檔案中各個處理器的解析速度(gb / s)如下,同樣使用 GNU GCC 9.1(帶有 -O3 旗標)。 目前流行的 Modern C++ 的 JSON 程式庫特別慢: 它顯然用解析速度換取了其他理想的特性。
parser | GB/s |
---|---|
simdjson | 2.5 |
RapidJSON UTF8-validation | 0.29 |
RapidJSON UTF8-valid., exact numbers | 0.28 |
RapidJSON insitu, UTF8-validation | 0.41 |
RapidJSON insitu, UTF8-valid., exact | 0.39 |
sajson (insitu, dynamic) | 0.62 |
sajson (insitu, static) | 0.88 |
dropbox | 0.13 |
fastjson | 0.27 |
gason | 0.59 |
ultrajson | 0.34 |
jsmn | 0.25 |
cJSON | 0.31 |
JSON for Modern C++ (nlohmann/json) | 0.1 |
無論是處理較小的檔案(例如300 byte)還是處理較大的檔案(例如3MB),simdjson 程式庫都可以提供較高的速度。 下圖顯示了在3.4 GHz Skylake處理器(GNU GCC 9,-O3)

目前實際在使用的專案
目前 Simdjson 也有以下的語言版本
我們將 “bindings”(僅包裝C ++代碼)和 porting 到另一種程式語言(重新實現所有內容)之間進行區分。
- ZippyJSON: Swift bindings for the simdjson project.
- pysimdjson: Python bindings for the simdjson project.
- simdjson-rs: Rust port.
- simdjson-rust: Rust wrapper (bindings).
- SimdJsonSharp: C# version for .NET Core (bindings and full port).
- simdjson_nodejs: Node.js bindings for the simdjson project.
- simdjson_php: PHP bindings for the simdjson project.
- simdjson_ruby: Ruby bindings for the simdjson project.
- simdjson-go: Go port using Golang assembly.
- rcppsimdjson: R bindings.
關於 simdjson
Simdjson 程式庫利用了現代微架構的優勢,與 SIMD 向量指令平行化,減少了分支錯誤預測,並減少了資料相依性,以利用每個 CPU 的多個執行核心。
有些人喜歡閱讀我們的論文: 我們的研究文章描述了 simdjson 的設計和實現: Geoff Langdale, Daniel Lemire, Parsing Gigabytes of JSON per Second, VLDB Journal 28 (6), 2019.Second, VLDB Journal 28 (6), 2019.
我們也有一個非正式的部落格文章提供了一些背景和情境。
專案網址
不受 FB 演算法影響,歡迎透過 e-mail 訂閱網站更新
❤️您應該有留意到,我們的網頁並不會出現干擾人的跳出煩人的廣告或是在內容中嵌入廣告,因為我們發現這樣對閱讀網頁的內容體驗真的是不好!
如果您覺得我們提供的內容服務還不錯,歡迎透過對以下產品/服務的購買投資來支持本站的營運走得更遠
如果暫時還不需要以下的付費服務,幫我們把這個網站分享給有需要的朋友,您的小小舉動會對 Soft & Share 有莫大的幫助!感謝您的支持!
🎈如果您點選優惠連結後,還是沒有看到優惠價格,請將瀏覽器的 cookie 清除 ( 清除 udemy 網站的就可以了 ),然後重新點選優惠連結並登入 Udemy 就可以了
- ❤️記得透過電腦瀏覽器登入 udemy ,使用這個✨優惠連結✨購買線上課程,本站可獲得 udemy 推薦獎金,歡迎透過我們的 A-Z 關鍵字索引 或 Udemy 策展找到您想要的課程
- ❤️LN+ for udemy/youtube/hahow/web 無縫整合 Notion 成為線上學習平台筆記工具
- ❤️更多付費服務(電子書/其他線上課程平台/軟體服務 )……