近日做一些效能最佳化工作,在挑選JSON類庫時,發現除了一般常用的JSON-lib外,還有一款號稱效能最快的JSON處理器Jackson,於是用上了剛學會的JMeter,對這兩個類庫進行了簡單的效能對比。
Jackson:http://jackson.codehaus.org/
JSON-lib:http://json-lib.sourceforge.net/
Gson:http://code.google.com/p/google-gson/
測試環境:
1、工作電腦:Intel雙核E8400 共6GHz,記憶體4GB,WinXP
2、JSON-lib用最新的JDK15,GSON版本是最新的v1.4,Jackson也是最新的v1.5.5,JDK-v1.6.0_20,JMeter-v2.4
3、測試時不開啟任何無關進程,每完成一項測試後關閉JMeter整理記憶體後,再進行下一項測試,每項測試回合3次,取平均值
4、JSON轉Java Bean意為將JSON格式轉換成Java類,這個類內包括Map、List、Date、Integer/Long/Double、String等類型的屬性,Java Bean轉Json則同理。另外,兩者互轉,每次轉換的資料都是隨機產生
測試結果:
* 輸送量的值越大越好,總耗時的值越小越好
JSON轉Bean,5個線程並發,約200位元組對象,1千萬次轉換:
| |
Jackson |
JSON-lib |
Gson |
| TPS |
64113.7 |
8067.4 |
13952.8 |
| 總耗時(秒) |
155 |
1238 |
700 |
Bean轉JSON,5個線程並發,約200位元組對象,1千萬次轉換:
| |
Jackson |
JSON-lib |
Gson |
| TPS |
54802 |
15093.2 |
17308.2 |
| 總耗時(秒) |
181 |
661 |
560 |
JSON轉Bean,5個線程並發,約2K對象,1千萬次轉換:
| |
Jackson |
JSON-lib |
Gson |
| TPS |
37314 |
2406.9 |
3657.50 |
| 總耗時(秒) |
267 |
4120 |
2720 |
Bean轉JSON,5個線程並發,約2K對象,1千萬次轉換:
| |
Jackson |
JSON-lib |
Gson |
| TPS |
30922.2 |
4274.8 |
4977.00 |
| 總耗時(秒) |
322 |
2320 |
2000 |
測試總結:
1、顯而易見,無論是哪種形式的轉換,Jackson > Gson > Json-lib。
Jackson的處理能力甚至高出Json-lib有10倍左右
2、JSON-lib似乎已經停止更新,最新的版本也是基於JDK15,而Jackson的社區則較為活躍;
3、在測試效能的同時,又以人肉方式對這三個類庫轉換的正確性 進行了檢查 ,三者均達100%正確 ;
4、JSON-lib在轉換諸如Date類型時較為累贅,如以下是兩者的轉換結果:
JSON-lib:
{"brithday":{"date":17,"day":2,"hours":9,"minutes":24,"month":7,"seconds":26,"time":1282008266398,"timezoneOffset":-480,"year":110}}
Jackson:
{"brithday":1282008123101}
5、JSON-lib依賴commons系列的包及 ezmorph包共 5個,而Jackson除自身的以外只依賴於commons-logging
6、Jackson提供完整基於節點的Tree Model,以及完整的OJM資料繫結功能。
Jackson使用樣本:
JacksonMapper:
建立為餓漢式單例模式 ,Jackson用於轉換的核心類ObjectMapper無需每次都new一個object,官網上的一句話:can reuse, share globally
Java代碼 /** * @author xuanyin * */ public class JacksonMapper { /** * */ private static final ObjectMapper mapper = new ObjectMapper(); /** * */ private JacksonMapper() { } /** * * @return */ public static ObjectMapper getInstance() { return mapper; } }
JSON轉Bean:
Java代碼 ...... String json = "..."; ObjectMapper mapper = JacksonMapper.getInstance(); YourBean bean = mapper.readValue(json, new YourBean().getClass()); ......
Bean轉JSON:
Java代碼 ...... YourBean bean = new YourBean(); ......