隨著AJAX的火熱應(yīng)用,JSON也越來越被重視,隨之而來的就是眾多的JSON庫,下面對常用的3個JSON庫(json-lib,jackson,gson)進行性能測試,看下結(jié)果如何:
一. 測試環(huán)境
??二. 測試代碼
?? ? ??1.先定義用于序列化成JSON的Bean,其中字段longTime需要在序列化的過程中被忽略,不輸出:
JsonEntity
?? ? ??2. 因json-lib不能直接設(shè)置日期的轉(zhuǎn)換方式,需要寫1個Processor的類
DateJsonValueProcessor
?? ? ??3. 寫1個輔助類JsonTestFactory:
?? ? ?4、下面是4個JSP頁面的代碼,json-lib使用了2種不同的方式進行測試:
?? ? ? ? ??jsonlib1.jsp 代碼:
?? ? ? ? ?jsonlib2.jsp 代碼:
????????????DateFormat?dateFormat?=?new?SimpleDateFormat("yyyy-MM-dd");
????????????JSONObject?json?=?new?JSONObject();
????????????JsonEntity?je?=?new?JsonEntity(1);
????????????json.element("id",?je.getId());
????????????json.element("name",?je.getName());
????????????json.element("money",?je.getMoney());
????????????json.element("date",?dateFormat.format(je.getDate()));
????????????out.println(json.toString());
????????%>]]>
?? ? ? ? ?jackson,jsp
????????????JsonEntity?je?=?new?JsonEntity(1);
????????????out.println(entity.JsonTestFactory.getMapper().writeValueAsString(je));
????????%>]]>
?? ? ? ??gson.jsp
????????????JsonEntity?je?=?new?JsonEntity(1);
????????????out.println(entity.JsonTestFactory.getGson().toJson(je));
????????%>]]>
三、測試結(jié)果
?? ? ??測試結(jié)果中只需關(guān)注Requests per second(平均每秒處理的請求數(shù)),Time per request(平均每個請求處理的時間)
1、ab 測試條件: 發(fā)送5000個請求,并發(fā)數(shù)為10。
1、ab 測試條件: 發(fā)送30000個請求,并發(fā)數(shù)為50。
google的gson傳說性能比較好,不知道為什么這次測試性能這么有問題。jackson的還是非常不錯的。
一. 測試環(huán)境
該測試只是在本人電腦上進行測試,每次測試前都重啟tomcat,清空緩存,日志等。開的程序也一樣,3次測試測試環(huán)境相差無幾。
json-lib版本:json-lib-2.3-jdk15(最新)
jackson版本 : 1.4.3(最新)
gson : 1.4 (最新)
測試工具:apache帶的ab工具
??二. 測試代碼
?? ? ??1.先定義用于序列化成JSON的Bean,其中字段longTime需要在序列化的過程中被忽略,不輸出:

?? ? ??2. 因json-lib不能直接設(shè)置日期的轉(zhuǎn)換方式,需要寫1個Processor的類

?? ? ??3. 寫1個輔助類JsonTestFactory:
public?class?JsonTestFactory?{
????static?JsonConfig?jc;
????static?Gson?gson;
????static?ObjectMapper?mapper;
????public?static?ObjectMapper?getMapper(){
????????if(mapper?==?null){
????????????mapper?=?new?ObjectMapper();
????????????SerializationConfig?sc?=?mapper.getSerializationConfig();
????????????sc.setDateFormat(new?SimpleDateFormat("yyyy-MM-dd"));
????????????mapper.setSerializationConfig(sc);
????????}
????????return?mapper;
????}
????public?static?Gson?getGson(){
????????if(gson?==?null){
????????????GsonBuilder?gb?=?new?GsonBuilder();
????????????gb.setDateFormat("yyyy-MM-dd");
????????????gb.excludeFieldsWithoutExposeAnnotation();
????????????gson?=?gb.create();
????????}
????????return?gson;
????}
????public?static?JsonConfig?getJsonConfig()?{
????????if(jc==null){
????????????jc?=?new?JsonConfig();
????????????jc.registerJsonValueProcessor(Date.class,?new?DateJsonValueProcessor("yyyy-MM-dd"));
????????????jc.registerPropertyExclusion(JsonEntity.class,"longTime");
????????}
????????return?jc;
????}
}
????static?JsonConfig?jc;
????static?Gson?gson;
????static?ObjectMapper?mapper;
????public?static?ObjectMapper?getMapper(){
????????if(mapper?==?null){
????????????mapper?=?new?ObjectMapper();
????????????SerializationConfig?sc?=?mapper.getSerializationConfig();
????????????sc.setDateFormat(new?SimpleDateFormat("yyyy-MM-dd"));
????????????mapper.setSerializationConfig(sc);
????????}
????????return?mapper;
????}
????public?static?Gson?getGson(){
????????if(gson?==?null){
????????????GsonBuilder?gb?=?new?GsonBuilder();
????????????gb.setDateFormat("yyyy-MM-dd");
????????????gb.excludeFieldsWithoutExposeAnnotation();
????????????gson?=?gb.create();
????????}
????????return?gson;
????}
????public?static?JsonConfig?getJsonConfig()?{
????????if(jc==null){
????????????jc?=?new?JsonConfig();
????????????jc.registerJsonValueProcessor(Date.class,?new?DateJsonValueProcessor("yyyy-MM-dd"));
????????????jc.registerPropertyExclusion(JsonEntity.class,"longTime");
????????}
????????return?jc;
????}
}
?? ? ?4、下面是4個JSP頁面的代碼,json-lib使用了2種不同的方式進行測試:
?? ? ? ? ??jsonlib1.jsp 代碼:
????????????
JsonEntity?je?=?new?JsonEntity(1);
????????????
out.println(JSONSerializer.toJSON(je,entity.JsonTestFactory.getJsonConfig()).toString());
%>]]>
JsonEntity?je?=?new?JsonEntity(1);
????????????
out.println(JSONSerializer.toJSON(je,entity.JsonTestFactory.getJsonConfig()).toString());
%>]]>
?? ? ? ? ?jsonlib2.jsp 代碼:
????????????DateFormat?dateFormat?=?new?SimpleDateFormat("yyyy-MM-dd");
????????????JSONObject?json?=?new?JSONObject();
????????????JsonEntity?je?=?new?JsonEntity(1);
????????????json.element("id",?je.getId());
????????????json.element("name",?je.getName());
????????????json.element("money",?je.getMoney());
????????????json.element("date",?dateFormat.format(je.getDate()));
????????????out.println(json.toString());
????????%>]]>
?? ? ? ? ?jackson,jsp
????????????JsonEntity?je?=?new?JsonEntity(1);
????????????out.println(entity.JsonTestFactory.getMapper().writeValueAsString(je));
????????%>]]>
?? ? ? ??gson.jsp
????????????JsonEntity?je?=?new?JsonEntity(1);
????????????out.println(entity.JsonTestFactory.getGson().toJson(je));
????????%>]]>
三、測試結(jié)果
?? ? ??測試結(jié)果中只需關(guān)注Requests per second(平均每秒處理的請求數(shù)),Time per request(平均每個請求處理的時間)
1、ab 測試條件: 發(fā)送5000個請求,并發(fā)數(shù)為10。
? | ?jsonlib1.jsp | jsonlib2.jsp? | jackson.jsp? | gson.jsp? |
?Concurrency Level | ?10 | ?10 | ?10 | ?10 |
?Time taken for tests | ?3.016 seconds | ?3.078 seconds | ?2.859 seconds | ?3.234 seconds |
?Complete requests | ?5000 | ?5000 | ?5000 | ?5000 |
?Requests per second | ?1658.03 [#/sec] | ?1624.37 [#/sec] | ?1748.63 [#/sec] | ?1545.89 [#/sec] |
?Time per request | ?6.031 [ms] | ?6.156 [ms] | ?5.719 [ms] | ?6.469 [ms] |
1、ab 測試條件: 發(fā)送30000個請求,并發(fā)數(shù)為50。
? | ?jsonlib1.jsp | jsonlib2.jsp? | jackson.jsp? | gson.jsp? |
?Concurrency Level | ?50 | ?50 | ?10 | ?10 |
?Time taken for tests | 11.359 seconds | ?12.047 seconds | ?10.922 seconds | ?13.391 seconds |
?Complete requests | ?30000 | ?30000 | ?30000 | ?30000 |
?Requests per second | ?2640.99 [#/sec] | ?2490.27 [#/sec] | ?2746.78 [#/sec] | ?2240.37 [#/sec] |
?Time per request | ?18.932 [ms] | 20.078 [ms] | ?18.203 [ms] | ?22.318 [ms] |
google的gson傳說性能比較好,不知道為什么這次測試性能這么有問題。jackson的還是非常不錯的。
[作者]:BearRui(AK-47)
[博客]: http://www.aygfsteel.com/bearrui/
[聲明]:本博所有文章版權(quán)歸作者所有(除特殊說明以外),轉(zhuǎn)載請注明出處.
[博客]: http://www.aygfsteel.com/bearrui/
[聲明]:本博所有文章版權(quán)歸作者所有(除特殊說明以外),轉(zhuǎn)載請注明出處.