JSON已經成爲當前服務器與WEB應用之間數據傳輸的公認標準,不過正如許多咱們所習覺得常的事情同樣,你會以爲這是理所固然的便再也不深刻思考 了。咱們不多會去想用到的這些JSON庫到底有什麼不一樣,但事實上它們的確是不太同樣的。所以,咱們運行了一個基準測試來對經常使用的幾個JSON庫進行了測 試,看看在解析不一樣大小的文件時哪一個庫的速度是最快的。下面我會把結果分享給你們。html
JSON一般用於傳輸及解析大文件。這對運行在Hadoop或者是Spark集羣上的數據處理程序而言是個很常見的場景。在給定的文件大小下,你能夠看到不一樣庫之間的解析速度存在着明顯的差異。java
高吞吐量的狀況下,會頻繁地傳輸並解析小文件,所以一開始的時候可能性能的差距並不明顯。但若是你須要在很是高負載下頻繁地解析大量的小文件,差距就開始增大了。微服務及分佈式架構常常會使用JSON來傳輸此類文件,由於這已是WEB API的事實標準。git
不是全部的JSON庫都叫"特侖蘇"。如何根據使用場景才選擇正確的庫是至關重要的。但願這個基準測試可以對你有所幫助。github
咱們選擇了四個主流的JSON庫來進行基準測試:JSON.simple, GSON, Jackson以及JSONP。在Java中進行JSON解析一般都會用到這幾個庫,選擇它們的緣由是它們在Github項目中的亮相頻率很高。json
下面即是咱們所測試的JSON庫:服務器
Yidong Fang的JSON.simple(https://github.com/fangyidong/json-simple)。JSON.simple是一個JSON編解碼的Java工具庫。它旨在打造一個輕量簡單且高性能的工具庫。架構
</li>
Google的GSON(https://github.com/google/gson)。GSON這個Java庫可以在Java對象和JSON間進行相互轉換。同時它還提供了對Java泛型的完整支持,並且還不須要你在類上面添加註解。無需添加註解使用起來則更爲便捷,同時在沒法修改源代碼的狀況下這仍是一個必要的先決條件。分佈式
</li>
FasterXML的Jackson項目(https://github.com/FasterXML/jackson)。Jackson是一個數據處理的工具套件,它的亮點是流式的JSON解析器及生成器。它是專爲Java設計的,同時也能處理其它非JSON的編碼。從咱們在Github中的統計來看,它應該是最流行的JSON解析器。微服務
</li>
Oracle的JSONP(https://jsonp.java.net/)。JSONP (JSON Processing)是JSON處理的一套Java API,從名字來看它就是用來生成及解析JSON串的。這是JSR353規範的一個開源實現。工具
</li> </ul>
咱們同時使用大文件和小文件對這些庫進行了基準測試。隨着文件大小的不一樣,處理這些文本所須要的系統資源也會隨之上升。
這個基準測試主要關注兩個關鍵場景:大文件下(190MB)的解析速度與小文件(1KB)下的解析速度。大文件取自這裏:https://github.com/zeMirco/sf-city-lots-json。小文件是從這裏隨機生成的:http://www.json-generator.com/。
不論是大文件仍是小文件,咱們都會用同一個庫重複運行10次。對於每個大文件,咱們都會用同一個庫來分別運行10次。而對於小文件,在單個庫的單 次運行中會重複執行10000次。在小文件測試的各次迭代中,文件內容都不會駐留在內存裏,測試所運行的機器是AWS的c3.large實例。
大文件的完整測試結果以下,我對小文件的結果求了個平均值。想要看完整的結果,請移步這裏。若是想看小文件測試的源碼,請從這裏下載。
結果相差甚大!Jackson與JSON.simple領跑了這輪測試,總體來看Jackson又要略優於JSON.simple。從測試運行的平 均結果來看,Jackson與JSON.simple在大文件上的表現要優秀一些,而JSONP排名第三落後甚遠,GSON更是遙遙墊底。
咱們再把結果換算成百分比看下。平均來看Jackson要勝出一籌。下面是結果的百分比數據,能夠從兩個維度來進行比較:
不一樣庫之間的性能差異着實不小。
結論:Jackson以略微優點勝出。JSON.simple緊隨其後,而剩下兩個庫則遠遠落後。
上表記錄的是對每一個文件解析10次的平均時間,總的平均時間見下方。各個庫在小文件測試中奪冠的次數以下:
這個結果貌似頗有說服力。然而,從全部文件的平均結果來看,GSON這個冠軍仍是當之無愧的,JSON.simple和JSONP的二三名之爭應該 沒什麼懸念。Jackson這輪倒是墊底了。儘管JSON.simple沒有在任何文件上奪得第一,但整體來看它的解析速度倒是排名第二位的。而 JSONP儘管在許多文件上都拿到了冠軍,但平均來看卻只拿到了第三名的成績。
還有一個值得注意的是,儘管Jackson是這輪最慢的庫,可是它在全部文件中的表現都很是一致,其它三個庫雖然偶然會比Jackson快不少,但在另外一些文件上的解析速度倒是旗鼓至關甚至更差。
咱們再把這些數字轉換成百分比看看,仍是一樣的兩個維度:
和大文件測試相比,此次的差距相對要小一些,但也仍是不容忽視的。
結論:很不幸的是,JSON.simple又以微弱的劣勢與冠軍失之交臂,這輪GSON勝。JSONP還是千年老三而這回Jackson則趕了個晚集。
解析速度並不是衡量一個JSON庫的惟一指標,但它的確很是重要。經過運行此次基準測試,咱們發現沒有一個庫能在全部文件上擊敗對手。大文件中表現優秀的卻在小文件上栽了根頭,反之亦然。
若是要從解析速度來看選擇哪一個庫的話還得取決於你的使用場景。
除非不考慮解析速度,否則JSONP徹底沒有什麼值得稱道的。它在大文件和小文件上的表現與其它庫相比都很糟糕。所幸的是,Java 9很快便會有原生的JSON實現了,相信JSONP未來的表現仍然值得期待。
終於講完了。若是你對JSON庫的解析速度比較敏感的話,大文件選Jackson,小文件選GSON,二者則JSON.simple。若是你對此次的基準測試有什麼疑問請在下方留言。
轉自:https://www.open-open.com/lib/view/open1434377191317.html