三款主流的 JSON 解析庫性能大比拼


三款主流的 JSON 解析庫性能大比拼

獨家授權自:開Github中文社區


大家好,我是hub哥,又到了本期分享。這期我們來聊聊Java中解析JSON的三個主流類庫

FastJSON、Gson和Jackson。

先來看下這三貨在Github上的基本數據:

FastJson

Github地址:
https://github.com/alibaba/fastjson

三款主流的 JSON 解析庫性能大比拼

Jackson

Github地址:
https://github.com/FasterXML/jackson

三款主流的 JSON 解析庫性能大比拼

Gson

Github地址:
https://github.com/google/gson

三款主流的 JSON 解析庫性能大比拼


碼友們對這三貨各方面也一直爭議不斷,大多關心的,還是性能以及穩定性。本文主測性能;對於這三個庫的簡介以及用法,就不去廢話了,一個簡單明瞭的測評,直接上!

主要對這三個類庫在JSON序列化和反序列化在速度方面的表現做一些測評,為了防止由於內存導致測試結果出現偏差,測試中對JVM內存配置-Xmx4g -Xms4g。

測試代碼已經貼到了文章末尾。

三款主流的 JSON 解析庫性能大比拼

JSON序列化(Object => JSON)

測試樣本數量為100000個,為了保證每個類庫在測試中都能處理同一個樣本,先把樣本Java對象保存在文件中。每個類庫測試5次,每次循環測試10遍,去掉最快速度和最慢速度,對剩下的8遍求平均值作為最終的速度,取5次測試中最好的平均速度作為最終的測試數據。

測試結果:

三款主流的 JSON 解析庫性能大比拼

從測試數據可以看出,Jackson是最快的(耗時比Gson少了大約700毫秒),Gson耗時最久。

三款主流的 JSON 解析庫性能大比拼

JSON反序列化(JSON => Object)

同樣,測試樣本數量為100000個,為了保證每個類庫在測試中都能處理同一個樣本,先把樣本JSON對象保存在文件中。每個類庫測試5次,每次循環測試10遍,去掉最快速度和最慢速度,對剩下的8遍求平均值作為最終的速,取5次測試中最好的平均速度作為最終的測試數據。

測試結果:

三款主流的 JSON 解析庫性能大比拼

從測試數據可以看出,在反序列化上性能 FastJson最快,不過與Jackson差距並不明顯,Gson耗時最久

三款主流的 JSON 解析庫性能大比拼

可見,不管是序列化還是反序列化,速度方面首先陣亡的,是Gson!

三款主流的 JSON 解析庫性能大比拼

那還剩下FastJson和Jackson

FastJson在某些方面確實快一些,但是和Jackson 的差距不大,優勢並沒有太明顯。Jackson還可以加上AfterBurner來使用byte generation,這樣和FastJson的差距就更小了。

除了在反序列化的速度勝出外,FastJson相比較 Jackson 有不少短板,我們可以從以下3方面對比:

1. 可定製性
Jackson有靈活的API,可以很容易進行擴展和定製,而且很多時候需要的模塊都已經有人提供了。比如guava中定義的數據類型,比如kotlin語言Immutable的類型等,比如java8 引入的新日期時間類型和Optional都已經有支持的模塊。

FastJson只有一個(簡陋)的SerializeFilter機制用來定製序列化,ParseProcess機制用來定製反序列化,每次調用序列化/反序列化的的時候都要自己傳filter或者Process這個參數過去,Jackson和 Gson都是直接註冊模塊就可以了,Jackson還可以使用SPI來自動發現和註冊模塊。

2. 代碼質量
公司有一些項目使用了Fastjson,在使用Fastjson的項目裡面曾碰到過的兩個低級bug:

1. 碰到在128~255 的字符直接異常,這些主要是西歐語言的字符,因為他用一個數組來記錄 轉義後的字符表示,但是數組長度只有128...

2. 內存佔用過多。Fastjson為了性能,在ThreadLocal中緩存了char[] buffer,這樣避免分配內存和gc的開銷。但是如果碰到了大的json(比如10M這樣的),就會佔用大量的內存,而且以後都是處理小JSON了內存佔用也回不來。
這些問題雖然後來的版本都修復了,但是也反映出Fastjson代碼質量上要求不夠嚴格。而Jackson這麼多年來使用上還沒有碰到過這樣的Bug.

3. 文檔
相比Jackson, Fastjson英文文檔就顯得比較欠缺,已有的也不規範,這樣就更沒法指望老外用了,相對還是國內開發者佔大多數

這麼來看,最終結果很明顯了:

三款主流的 JSON 解析庫性能大比拼

觀點

JSON從發明到現在之所以流行,並不是因為json快的原因(比json快且小巧的格式和類庫一大把),而是因為json和web結合的時候更易於使用,對開發人員易於理解。很多人拿FastJson和Jackson比,就像拿非智能機和iphone比待機時間,其功能性不一樣,Jackson的很多功能FastJson並沒有實現,所以這種對比也不客觀。FastJson之所以沒在國際上流行起來,最主要的原因應該是開發者的思路全放到“快”上去了,而偏離了“標準”及功能性,質量也不夠好,有點“捨本逐末”的味道。

當然在目前的環境下,國產軟件能踏實的心態做好開源的不多,FastJson團隊能這麼快的反饋並修正問題,這種精神還是值得稱讚的。希望國內的技術從業者能更重視“技術的原始需求”。

測試代碼:

樣本對象包括Boolean、Int、Long、Double、Date、String、List和Map字段,其中List長度和Map的Key數量可以根據需要改變。


開發者技術前線 ,彙集技術前線快訊和關注行業趨勢,大廠乾貨,是開發者經歷和成長的優秀指南。


好文點個在贊吧!


分享到:


相關文章: