在Java裏面,咱們常用JSON格式的工具包對字符串或者對象進行解析,通常用得比較普遍的三種分別爲:fastJson,jackJson,Gson,關於各個工具包的性能比較網絡上比比皆是,在這裏我只闡述在我本機環境下的測試結果,而後在根據結果對三種工具包進行一個解析,首先先貼代碼:java
import java.util.Map; import org.codehaus.jackson.map.ObjectMapper; import com.alibaba.fastjson.JSONObject; import com.google.gson.Gson; public class JsonTest1 { private static long count=10000; /** * @param args * @throws Exception */ public static void main(String[] args) throws Exception { // TODO Auto-generated method stub gson(); System.gc(); jackJson(); System.gc(); fastJson(); System.gc(); System.out.println("---------------------------------------------------------------"); gsonJson(); System.gc(); jackJsonJson(); System.gc(); fastJsonJson(); } private static long gson(){ Demo demo=new Demo(); demo.setCmd("1"); demo.setContent("dd"); long endTime1=System.currentTimeMillis(); for(int i=0;i<count;i++){ Gson gson=new Gson(); gson.toJson(demo); } long endTime2=System.currentTimeMillis(); System.out.println("gson--obj--json:"+(count*1000)/(endTime2-endTime1)); return endTime2-endTime1; } private static long jackJson() throws Exception{ Demo demo=new Demo(); demo.setCmd("1"); demo.setContent("dd"); long endTime1=System.currentTimeMillis(); for(int i=0;i<count;i++){ ObjectMapper objectMapper = new ObjectMapper(); objectMapper.writeValueAsString(demo); } long endTime2=System.currentTimeMillis(); System.out.println("jackJson--obj--json:"+(count*1000)/(endTime2-endTime1)); return endTime2-endTime1; } private static long fastJson(){ Demo demo=new Demo(); demo.setCmd("1"); demo.setContent("dd"); long endTime1=System.currentTimeMillis(); for(int i=0;i<count;i++){ JSONObject jsonObject=new JSONObject(); jsonObject.toJSON(demo); } long endTime2=System.currentTimeMillis(); System.out.println("fastJson--obj--json:"+(count*1000)/(endTime2-endTime1)); return endTime2-endTime1; } private static long gsonJson(){ String json="{\"cmd\":\"1\",\"sss\":\"dd\"}"; long endTime1=System.currentTimeMillis(); for(int i=0;i<count;i++){ Gson gson=new Gson(); gson.fromJson(json,Map.class); } long endTime2=System.currentTimeMillis(); System.out.println("gson--json--obj:"+(count*1000)/(endTime2-endTime1)); return endTime2-endTime1; } private static long jackJsonJson() throws Exception{ String json="{\"cmd\":\"1\",\"sss\":\"dd\"}"; long endTime1=System.currentTimeMillis(); for(int i=0;i<count;i++){ ObjectMapper objectMapper = new ObjectMapper(); objectMapper.readValue(json, Map.class); } long endTime2=System.currentTimeMillis(); System.out.println("jackJson--json--obj:"+(count*1000)/(endTime2-endTime1)); return endTime2-endTime1; } private static long fastJsonJson(){ String json="{\"cmd\":\"1\",\"sss\":\"dd\"}"; long endTime1=System.currentTimeMillis(); for(int i=0;i<count;i++){ JSONObject jsonObject=new JSONObject(); jsonObject.parseObject(json, Map.class); } long endTime2=System.currentTimeMillis(); System.out.println("fastJson--json--obj:"+(count*1000)/(endTime2-endTime1)); return endTime2-endTime1; } } class Demo { private String cmd; private String content; public String getCmd() { return cmd; } public void setCmd(String cmd) { this.cmd = cmd; } public String getContent() { return content; } public void setContent(String content) { this.content = content; } }
運行結果以下:json
咱們能夠看到fastJson的速度明顯高於其餘兩個,真的是這樣的嗎?咱們把代碼在改進一下。安全
import java.util.Map; import org.codehaus.jackson.map.ObjectMapper; import com.alibaba.fastjson.JSONObject; import com.google.gson.Gson; public class JsonTest { private static ObjectMapper objectMapper = new ObjectMapper(); private static Gson gson=new Gson(); private static JSONObject jsonObject=new JSONObject(); private static long count=10000; /** * @param args * @throws Exception */ public static void main(String[] args) throws Exception { // TODO Auto-generated method stub gson(); System.gc(); jackJson(); System.gc(); fastJson(); System.gc(); System.out.println("---------------------------------------------------------------"); gsonJson(); System.gc(); jackJsonJson(); System.gc(); fastJsonJson(); } private static long gson(){ Demo demo=new Demo(); demo.setCmd("1"); demo.setContent("dd"); long endTime1=System.currentTimeMillis(); for(int i=0;i<count;i++){ gson.toJson(demo); } long endTime2=System.currentTimeMillis(); System.out.println("gson--obj--json:"+(count*1000)/(endTime2-endTime1)); return endTime2-endTime1; } private static long jackJson() throws Exception{ Demo demo=new Demo(); demo.setCmd("1"); demo.setContent("dd"); long endTime1=System.currentTimeMillis(); for(int i=0;i<count;i++){ objectMapper.writeValueAsString(demo); } long endTime2=System.currentTimeMillis(); System.out.println("jackJson--obj--json:"+(count*1000)/(endTime2-endTime1)); return endTime2-endTime1; } private static long fastJson(){ Demo demo=new Demo(); demo.setCmd("1"); demo.setContent("dd"); long endTime1=System.currentTimeMillis(); for(int i=0;i<count;i++){ jsonObject.toJSON(demo); } long endTime2=System.currentTimeMillis(); System.out.println("fastJson--obj--json:"+(count*1000)/(endTime2-endTime1)); return endTime2-endTime1; } private static long gsonJson(){ String json="{\"cmd\":\"1\",\"sss\":\"dd\"}"; long endTime1=System.currentTimeMillis(); for(int i=0;i<count;i++){ gson.fromJson(json,Map.class); } long endTime2=System.currentTimeMillis(); System.out.println("gson--json--obj:"+(count*1000)/(endTime2-endTime1)); return endTime2-endTime1; } private static long jackJsonJson() throws Exception{ String json="{\"cmd\":\"1\",\"sss\":\"dd\"}"; long endTime1=System.currentTimeMillis(); for(int i=0;i<count;i++){ objectMapper.readValue(json, Map.class); } long endTime2=System.currentTimeMillis(); System.out.println("jackJson--json--obj:"+(count*1000)/(endTime2-endTime1)); return endTime2-endTime1; } private static long fastJsonJson(){ String json="{\"cmd\":\"1\",\"sss\":\"dd\"}"; long endTime1=System.currentTimeMillis(); for(int i=0;i<count;i++){ jsonObject.parseObject(json, Map.class); } long endTime2=System.currentTimeMillis(); System.out.println("fastJson--json--obj:"+(count*1000)/(endTime2-endTime1)); return endTime2-endTime1; } } class Demo { private String cmd; private String content; public String getCmd() { return cmd; } public void setCmd(String cmd) { this.cmd = cmd; } public String getContent() { return content; } public void setContent(String content) { this.content = content; } }
運行結果以下:網絡
看到差別了沒?上面的第一部分的代碼是每次都要去new新對象出來,在這點上致使了fastJson有絕對的優點,而當咱們初始化的時候就把該準備的資源準備好呢?fastJson的優點一下就體現不出來了,通過屢次測試發現最快的是gson。並且根據上面的結果咱們能夠看出來fastJson的優點是在json轉化爲對象的時候比較快,而對象轉化爲json格式的字符串的時候性能上是沒什麼優點的,反而是最差的。app
結論:工具
在作了初始化的狀況下GSON的速度都是最快的。性能
在使用GSON或jackJson作Json處理時最好有個全局的解析對象,不要每次調用的時候都去生成那樣對性能的影響很大,另外通過測試,這裏面沒有線程安全問題。測試
fastJson在json轉化爲對象的應用場景下性能比較突出this
本次的jar版本爲:google
fastJson版本爲1.1.41
GSON:2.1
O
本文出自 「陳硯羲」 博客,請務必保留此出處http://chenyanxi.blog.51cto.com/4599355/1543445