JSON 庫之性能比較:JSON.simple VS GSON VS Jackson VS JSONP
Java 中哪個(gè) JSON 庫的解析速度是最快的?
JSON 已經(jīng)成為當(dāng)前服務(wù)器與 WEB 應(yīng)用之間數(shù)據(jù)傳輸?shù)墓J(rèn)標(biāo)準(zhǔn),不過正如許多我們所習(xí)以為常的事情一樣,你會覺得這是理所當(dāng)然的便不再深入思考了。我們很少會去想用到的這些 JSON 庫到底有什么不同,但事實(shí)上它們的確是不太一樣的。因此,我們運(yùn)行了一個(gè)基準(zhǔn)測試來對常用的幾個(gè) JSON 庫進(jìn)行了測試,看看在解析不同大小的文件時(shí)哪個(gè)庫的速度是最快的。下面我會把結(jié)果分享給大家。
JSON 通常用于傳輸及解析大文件。這對運(yùn)行在 Hadoop 或者是 Spark 集群上的數(shù)據(jù)處理程序而言是個(gè)很常見的場景。在給定的文件大小下,你可以看到不同庫之間的解析速度存在著明顯的差別。
高吞吐量的情況下,會頻繁地傳輸并解析小文件,因此一開始的時(shí)候可能性能的差距并不明顯。但如果你需要在非常高負(fù)載下頻繁地解析大量的小文件,差距就開始增大了。微服務(wù)及分布式架構(gòu)經(jīng)常會使用 JSON 來傳輸此類文件,因?yàn)檫@已經(jīng)是 WEB API 的事實(shí)標(biāo)準(zhǔn)。
不是所有的 JSON 庫都叫” 特侖蘇”。如何根據(jù)使用場景才選擇正確的庫是相當(dāng)重要的。希望這個(gè)基準(zhǔn)測試能夠?qū)δ阌兴鶐椭?/p>
JSON 庫
JSON.simple vs GSON vs Jackson vs JSONP
我們選擇了四個(gè)主流的 JSON 庫來進(jìn)行基準(zhǔn)測試:JSON.simple, GSON, Jackson 以及 JSONP。在 Java 中進(jìn)行 JSON 解析通常都會用到這幾個(gè)庫,選擇它們的原因是它們在 Github 項(xiàng)目中的亮相頻率很高。
下面便是我們所測試的 JSON 庫:
- Yidong Fang 的 JSON.simple 。JSON.simple 是一個(gè) JSON 編解碼的 Java 工具庫。它旨在打造一個(gè)輕量簡單且高性能的工具庫。
- Google 的 GSON。GSON 這個(gè) Java 庫能夠在 Java 對象和 JSON 間進(jìn)行相互轉(zhuǎn)換。同時(shí)它還提供了對 Java 泛型的完整支持,而且還不需要你在類上面添加注解。無需添加注解使用起來則更為便捷,同時(shí)在無法修改源代碼的情況下這還是一個(gè)必要的先決條件。
- FasterXML 的 Jackson 項(xiàng)目。Jackson 是一個(gè)數(shù)據(jù)處理的工具套件,它的亮點(diǎn)是流式的 JSON 解析器及生成器。它是專為 Java 設(shè)計(jì)的,同時(shí)也能處理其它非 JSON 的編碼。從我們在 Github 中的統(tǒng)計(jì)來看,它應(yīng)該是***的 JSON 解析器。
- Oracle 的 JSONP。JSONP (JSON Processing) 是 JSON 處理的一套 Java API, 從名字來看它就是用來生成及解析 JSON 串的。這是 JSR353 規(guī)范的一個(gè)開源實(shí)現(xiàn)。
基準(zhǔn)測試
我們同時(shí)使用大文件和小文件對這些庫進(jìn)行了基準(zhǔn)測試。隨著文件大小的不同,處理這些文本所需要的系統(tǒng)資源也會隨之上升。
這個(gè)基準(zhǔn)測試主要關(guān)注兩個(gè)關(guān)鍵場景:大文件下 (190MB) 的解析速度與小文件(1KB)下的解析速度。大文件取自這里。小文件是從這里隨機(jī)生成的。
不管是大文件還是小文件,我們都會用同一個(gè)庫重復(fù)運(yùn)行 10 次。對于每一個(gè)大文件,我們都會用同一個(gè)庫來分別運(yùn)行 10 次。而對于小文件,在單個(gè)庫的單次運(yùn)行中會重復(fù)執(zhí)行 10000 次。在小文件測試的各次迭代中,文件內(nèi)容都不會駐留在內(nèi)存里,測試所運(yùn)行的機(jī)器是 AWS 的 c3.large 實(shí)例。
大文件的完整測試結(jié)果如下,我對小文件的結(jié)果求了個(gè)平均值。
大文件結(jié)果

結(jié)果相差甚大!Jackson 與 JSON.simple 領(lǐng)跑了這輪測試,整體來看 Jackson 又要略優(yōu)于 JSON.simple。從測試運(yùn)行的平均結(jié)果來看,Jackson 與 JSON.simple 在大文件上的表現(xiàn)要優(yōu)秀一些,而 JSONP 排名第三落后甚遠(yuǎn),GSON 更是遙遙墊底。
我們再把結(jié)果換算成百分比看下。平均來看 Jackson 要?jiǎng)俪鲆换I。下面是結(jié)果的百分比數(shù)據(jù),可以從兩個(gè)維度來進(jìn)行比較:

不同庫之間的性能差別著實(shí)不小。
結(jié)論:Jackson 以略微優(yōu)勢勝出。JSON.simple 緊隨其后,而剩下兩個(gè)庫則遠(yuǎn)遠(yuǎn)落后。
小文件結(jié)果

上表記錄的是對每個(gè)文件解析 10 次的平均時(shí)間,總的平均時(shí)間見下方。各個(gè)庫在小文件測試中奪冠的次數(shù)如下:
- GSON - 14
- JSONP - 5
- Jackson -1
- JSON.simple - 0
這個(gè)結(jié)果貌似很有說服力。然而,從所有文件的平均結(jié)果來看,GSON 這個(gè)冠軍還是當(dāng)之無愧的,JSON.simple 和 JSONP 的二三名之爭應(yīng)該沒什么懸念。Jackson 這輪卻是墊底了。盡管 JSON.simple 沒有在任何文件上奪得***,但總體來看它的解析速度卻是排名第二位的。而 JSONP 盡管在許多文件上都拿到了冠軍,但平均來看卻只拿到了第三名的成績。
還有一個(gè)值得注意的是,盡管 Jackson 是這輪最慢的庫,但是它在所有文件中的表現(xiàn)都非常一致,其它三個(gè)庫雖然偶然會比 Jackson 快很多,但在另一些文件上的解析速度卻是旗鼓相當(dāng)甚至更差。
我們再把這些數(shù)字轉(zhuǎn)換成百分比看看,還是同樣的兩個(gè)維度:

和大文件測試相比,這次的差距相對要小一些,但也還是不容忽視的。
結(jié)論:很不幸的是,JSON.simple 又以微弱的劣勢與冠軍失之交臂,這輪 GSON 勝。JSONP 仍是千年老三而這回 Jackson 則趕了個(gè)晚集。
總結(jié)
解析速度并非衡量一個(gè) JSON 庫的唯一指標(biāo),但它的確非常重要。通過運(yùn)行這次基準(zhǔn)測試,我們發(fā)現(xiàn)沒有一個(gè)庫能在所有文件上擊敗對手。大文件中表現(xiàn)優(yōu)秀的卻在小文件上栽了根頭,反之亦然。
- 如果要從解析速度來看選擇哪個(gè)庫的話還得取決于你的使用場景。
- 如果你的應(yīng)用經(jīng)常會處理大的 JSON 文件,那么 Jackson 應(yīng)該是你的菜。GSON 在大文件上表現(xiàn)得相當(dāng)吃力。
- 如果你主要是處理小文件請求,比如某個(gè)微服務(wù)或者分布式架構(gòu)的初始化,那么 GSON 當(dāng)是***。Jackson 在小文件上的表現(xiàn)則不如人意。
- 如果這兩種文件你都經(jīng)常會處理到,那么在兩輪表現(xiàn)中都位居第二的 JSON.simple 對此類場景則更為適合。在不同的文件大小上 Jackson 和 GSON 的表現(xiàn)都不太好。
除非不考慮解析速度,不然 JSONP 完全沒有什么值得稱道的。它在大文件和小文件上的表現(xiàn)與其它庫相比都很糟糕。所幸的是,Java 9 很快便會有原生的 JSON 實(shí)現(xiàn)了,相信 JSONP 將來的表現(xiàn)仍然值得期待。
終于講完了。如果你對 JSON 庫的解析速度比較敏感的話,大文件選 Jackson,小文件選 GSON,兩者則 JSON.simple。如果你對這次的基準(zhǔn)測試有什么疑問請?jiān)谙路搅粞?