fastJson,jackJson,Gson性能比較

    在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

wKiom1P2t06wG442AAEqxl2UYOA293.jpg

咱們能夠看到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;
	}
}

運行結果以下:網絡

wKioL1P2uOaQRknmAAF8TXX1gMo886.jpg看到差別了沒?上面的第一部分的代碼是每次都要去new新對象出來,在這點上致使了fastJson有絕對的優點,而當咱們初始化的時候就把該準備的資源準備好呢?fastJson的優點一下就體現不出來了,通過屢次測試發現最快的是gson。並且根據上面的結果咱們能夠看出來fastJson的優點是在json轉化爲對象的時候比較快,而對象轉化爲json格式的字符串的時候性能上是沒什麼優點的,反而是最差的。app

結論:工具

  • 在作了初始化的狀況下GSON的速度都是最快的。性能

  • 在使用GSON或jackJson作Json處理時最好有個全局的解析對象,不要每次調用的時候都去生成那樣對性能的影響很大,另外通過測試,這裏面沒有線程安全問題。測試

  • fastJson在json轉化爲對象的應用場景下性能比較突出this


本次的jar版本爲:google

wKioL1P2uvqwypPJAABXvMrt0rA533.jpg

fastJson版本爲1.1.41

GSON:2.1

O

wKioL1P2u4DDbcSeAAELL5LLotg849.jpg

wKiom1P2umixLkgbAAFKe8iT0ls201.jpg


本文出自 「陳硯羲」 博客,請務必保留此出處http://chenyanxi.blog.51cto.com/4599355/1543445

相關文章
相關標籤/搜索