您好,登錄后才能下訂單哦!
這篇文章主要講解了“JSON庫(kù)的性能比較”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“JSON庫(kù)的性能比較”吧!
Java 中哪個(gè) JSON 庫(kù)的解析速度是最快的?
JSON 已經(jīng)成為當(dāng)前服務(wù)器與 WEB 應(yīng)用之間數(shù)據(jù)傳輸?shù)墓J(rèn)標(biāo)準(zhǔn),不過(guò)正如許多我們所習(xí)以為常的事情一樣,你會(huì)覺(jué)得這是理所當(dāng)然的便不再深入思考了。我們很少會(huì)去想用到的這些 JSON 庫(kù)到底有什么不同,但事實(shí)上它們的確是不太一樣的。因此,我們運(yùn)行了一個(gè)基準(zhǔn)測(cè)試來(lái)對(duì)常用的幾個(gè) JSON 庫(kù)進(jìn)行了測(cè)試,看看在解析不同大小的文件時(shí)哪個(gè)庫(kù)的速度是最快的。下面我會(huì)把結(jié)果分享給大家。
JSON 通常用于傳輸及解析大文件。這對(duì)運(yùn)行在 Hadoop 或者是 Spark 集群上的數(shù)據(jù)處理程序而言是個(gè)很常見(jiàn)的場(chǎng)景。在給定的文件大小下,你可以看到不同庫(kù)之間的解析速度存在著明顯的差別。
高吞吐量的情況下,會(huì)頻繁地傳輸并解析小文件,因此一開(kāi)始的時(shí)候可能性能的差距并不明顯。但如果你需要在非常高負(fù)載下頻繁地解析大量的小文件,差距就開(kāi)始增大了。微服務(wù)及分布式架構(gòu)經(jīng)常會(huì)使用 JSON 來(lái)傳輸此類(lèi)文件,因?yàn)檫@已經(jīng)是 WEB API 的事實(shí)標(biāo)準(zhǔn)。
不是所有的 JSON 庫(kù)都叫” 特侖蘇”。如何根據(jù)使用場(chǎng)景才選擇正確的庫(kù)是相當(dāng)重要的。希望這個(gè)基準(zhǔn)測(cè)試能夠?qū)δ阌兴鶐椭?/p>
JSON 庫(kù)
JSON.simple vs GSON vs Jackson vs JSONP
我們選擇了四個(gè)主流的 JSON 庫(kù)來(lái)進(jìn)行基準(zhǔn)測(cè)試:JSON.simple, GSON, Jackson 以及 JSONP。在 Java 中進(jìn)行 JSON 解析通常都會(huì)用到這幾個(gè)庫(kù),選擇它們的原因是它們?cè)?Github 項(xiàng)目中的亮相頻率很高。
下面便是我們所測(cè)試的 JSON 庫(kù):
Yidong Fang 的 JSON.simple 。JSON.simple 是一個(gè) JSON 編解碼的 Java 工具庫(kù)。它旨在打造一個(gè)輕量簡(jiǎn)單且高性能的工具庫(kù)。
Google 的 GSON。GSON 這個(gè) Java 庫(kù)能夠在 Java 對(duì)象和 JSON 間進(jìn)行相互轉(zhuǎn)換。同時(shí)它還提供了對(duì) Java 泛型的完整支持,而且還不需要你在類(lèi)上面添加注解。無(wú)需添加注解使用起來(lái)則更為便捷,同時(shí)在無(wú)法修改源代碼的情況下這還是一個(gè)必要的先決條件。
FasterXML 的 Jackson 項(xiàng)目。Jackson 是一個(gè)數(shù)據(jù)處理的工具套件,它的亮點(diǎn)是流式的 JSON 解析器及生成器。它是專(zhuān)為 Java 設(shè)計(jì)的,同時(shí)也能處理其它非 JSON 的編碼。從我們?cè)?Github 中的統(tǒng)計(jì)來(lái)看,它應(yīng)該是***的 JSON 解析器。
Oracle 的 JSONP。JSONP (JSON Processing) 是 JSON 處理的一套 Java API, 從名字來(lái)看它就是用來(lái)生成及解析 JSON 串的。這是 JSR353 規(guī)范的一個(gè)開(kāi)源實(shí)現(xiàn)。
基準(zhǔn)測(cè)試
我們同時(shí)使用大文件和小文件對(duì)這些庫(kù)進(jìn)行了基準(zhǔn)測(cè)試。隨著文件大小的不同,處理這些文本所需要的系統(tǒng)資源也會(huì)隨之上升。
這個(gè)基準(zhǔn)測(cè)試主要關(guān)注兩個(gè)關(guān)鍵場(chǎng)景:大文件下 (190MB) 的解析速度與小文件(1KB)下的解析速度。大文件取自這里。小文件是從這里隨機(jī)生成的。
不管是大文件還是小文件,我們都會(huì)用同一個(gè)庫(kù)重復(fù)運(yùn)行 10 次。對(duì)于每一個(gè)大文件,我們都會(huì)用同一個(gè)庫(kù)來(lái)分別運(yùn)行 10 次。而對(duì)于小文件,在單個(gè)庫(kù)的單次運(yùn)行中會(huì)重復(fù)執(zhí)行 10000 次。在小文件測(cè)試的各次迭代中,文件內(nèi)容都不會(huì)駐留在內(nèi)存里,測(cè)試所運(yùn)行的機(jī)器是 AWS 的 c3.large 實(shí)例。
大文件的完整測(cè)試結(jié)果如下,我對(duì)小文件的結(jié)果求了個(gè)平均值。
大文件結(jié)果
結(jié)果相差甚大!Jackson 與 JSON.simple 領(lǐng)跑了這輪測(cè)試,整體來(lái)看 Jackson 又要略?xún)?yōu)于 JSON.simple。從測(cè)試運(yùn)行的平均結(jié)果來(lái)看,Jackson 與 JSON.simple 在大文件上的表現(xiàn)要優(yōu)秀一些,而 JSONP 排名第三落后甚遠(yuǎn),GSON 更是遙遙墊底。
我們?cè)侔呀Y(jié)果換算成百分比看下。平均來(lái)看 Jackson 要?jiǎng)俪鲆换I。下面是結(jié)果的百分比數(shù)據(jù),可以從兩個(gè)維度來(lái)進(jìn)行比較:
不同庫(kù)之間的性能差別著實(shí)不小。
結(jié)論:Jackson 以略微優(yōu)勢(shì)勝出。JSON.simple 緊隨其后,而剩下兩個(gè)庫(kù)則遠(yuǎn)遠(yuǎn)落后。
小文件結(jié)果
上表記錄的是對(duì)每個(gè)文件解析 10 次的平均時(shí)間,總的平均時(shí)間見(jiàn)下方。各個(gè)庫(kù)在小文件測(cè)試中奪冠的次數(shù)如下:
GSON - 14
JSONP - 5
Jackson -1
JSON.simple - 0
這個(gè)結(jié)果貌似很有說(shuō)服力。然而,從所有文件的平均結(jié)果來(lái)看,GSON 這個(gè)冠軍還是當(dāng)之無(wú)愧的,JSON.simple 和 JSONP 的二三名之爭(zhēng)應(yīng)該沒(méi)什么懸念。Jackson 這輪卻是墊底了。盡管 JSON.simple 沒(méi)有在任何文件上奪得***,但總體來(lái)看它的解析速度卻是排名第二位的。而 JSONP 盡管在許多文件上都拿到了冠軍,但平均來(lái)看卻只拿到了第三名的成績(jī)。
還有一個(gè)值得注意的是,盡管 Jackson 是這輪最慢的庫(kù),但是它在所有文件中的表現(xiàn)都非常一致,其它三個(gè)庫(kù)雖然偶然會(huì)比 Jackson 快很多,但在另一些文件上的解析速度卻是旗鼓相當(dāng)甚至更差。
我們?cè)侔堰@些數(shù)字轉(zhuǎn)換成百分比看看,還是同樣的兩個(gè)維度:
和大文件測(cè)試相比,這次的差距相對(duì)要小一些,但也還是不容忽視的。
結(jié)論:很不幸的是,JSON.simple 又以微弱的劣勢(shì)與冠軍失之交臂,這輪 GSON 勝。JSONP 仍是千年老三而這回 Jackson 則趕了個(gè)晚集。
總結(jié)
解析速度并非衡量一個(gè) JSON 庫(kù)的唯一指標(biāo),但它的確非常重要。通過(guò)運(yùn)行這次基準(zhǔn)測(cè)試,我們發(fā)現(xiàn)沒(méi)有一個(gè)庫(kù)能在所有文件上擊敗對(duì)手。大文件中表現(xiàn)優(yōu)秀的卻在小文件上栽了根頭,反之亦然。
如果要從解析速度來(lái)看選擇哪個(gè)庫(kù)的話還得取決于你的使用場(chǎng)景。
如果你的應(yīng)用經(jīng)常會(huì)處理大的 JSON 文件,那么 Jackson 應(yīng)該是你的菜。GSON 在大文件上表現(xiàn)得相當(dāng)吃力。
如果你主要是處理小文件請(qǐng)求,比如某個(gè)微服務(wù)或者分布式架構(gòu)的初始化,那么 GSON 當(dāng)是***。Jackson 在小文件上的表現(xiàn)則不如人意。
如果這兩種文件你都經(jīng)常會(huì)處理到,那么在兩輪表現(xiàn)中都位居第二的 JSON.simple 對(duì)此類(lèi)場(chǎng)景則更為適合。在不同的文件大小上 Jackson 和 GSON 的表現(xiàn)都不太好。
除非不考慮解析速度,不然 JSONP 完全沒(méi)有什么值得稱(chēng)道的。它在大文件和小文件上的表現(xiàn)與其它庫(kù)相比都很糟糕。所幸的是,Java 9 很快便會(huì)有原生的 JSON 實(shí)現(xiàn)了,相信 JSONP 將來(lái)的表現(xiàn)仍然值得期待。
感謝各位的閱讀,以上就是“JSON庫(kù)的性能比較”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)JSON庫(kù)的性能比較這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。