posts - 36, comments - 419, trackbacks - 0, articles - 0
            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

          幾種常用JSON庫的性能測試。

          Posted on 2010-03-11 18:00 BearRui(AK-47) 閱讀(6226) 評論(3)  編輯  收藏 所屬分類: Java
          隨著AJAX的火熱應(yīng)用,JSON也越來越被重視,隨之而來的就是眾多的JSON庫,下面對常用的3個JSON庫(json-lib,jackson,gson)進行性能測試,看下結(jié)果如何:

          一. 測試環(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需要在序列化的過程中被忽略,不輸出:
          JsonEntity

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

          ?? ? ??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;
          ????}
          }

          ?? ? ?4、下面是4個JSP頁面的代碼,json-lib使用了2種不同的方式進行測試:
          ?? ? ? ? ??jsonlib1.jsp 代碼:
          ????????????
          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.jspjsonlib2.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.jspjsonlib2.jsp?jackson.jsp?gson.jsp?
          ?Concurrency Level?50?50?10?10
          ?Time taken for tests11.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)載請注明出處.
          英雄,別走啊,幫哥評論下:  

          精彩推薦 好文要頂 水平一般 看不懂 還需努力

          評論

          # re: 幾種常用JSON庫的性能測試。  回復(fù)  更多評論   

          2010-03-12 12:04 by BearRui(AK-47)
          @凡客誠品官方網(wǎng)站
          沒看明白你的意思?

          # re: 幾種常用JSON庫的性能測試。  回復(fù)  更多評論   

          2010-04-06 22:33 by airfan
          這種測法大頭都給http連接和輸入輸出了,json序列化本身開銷忽略不計,測個毛

          # re: 幾種常用JSON庫的性能測試。  回復(fù)  更多評論   

          2013-09-24 15:35 by adsf
          沒有思考為什么這樣
          主站蜘蛛池模板: 通江县| 临江市| 永修县| 从化市| 藁城市| 鞍山市| 肇东市| 全南县| 调兵山市| 嘉鱼县| 姜堰市| 忻州市| 教育| 五家渠市| 华蓥市| 怀化市| 门源| 衡山县| 托克逊县| 安福县| 岐山县| 阳谷县| 周至县| 娱乐| 枞阳县| 南宁市| 都安| 乐陵市| 临湘市| 乌鲁木齐县| 株洲市| 天等县| 桓仁| 介休市| 江山市| 廊坊市| 襄汾县| 彰化县| 田阳县| 和龙市| 化德县|