FastJson、Gson、Jackson json解析性能比較
我們之前的項目中一直使用的Jackson API解析記錄日志,後面随着資料量的增加,系統運作越來越慢,特别是一些查詢接口,達到了不能忍受的地方。經過分析發現,罪魁禍首就是在記錄日志的過程中的json解析,因為當時項目非常緊急,是以就直接放棄這種json解析記錄日志的方式,也沒有找相關的替代方案,最近幾天項目沒有那麼忙了,就想起了這事,是以就研究了下各種json解析方案,主要是大家常用的三個:FastJson、Gson以及我們之前項目中用到的Jackson;
直接上代碼
FastJson實作
package haha.json;
import com.alibaba.fastjson.JSON;
public classFastJsonTest {
publicstaticString beanToJson(Object objBean) {
return JSON.toJSONString(objBean);
}
}
Jackson實作
package haha.json;
import java.io.IOException;
import java.io.StringWriter;
import org.codehaus.jackson.JsonGenerator;
import org.codehaus.jackson.JsonParseException;
import org.codehaus.jackson.map.JsonMappingException;
import org.codehaus.jackson.map.ObjectMapper;
public classJacksonTest {
publicstaticString beanToJson(Object objBean) {
String jsonStr = "";
ObjectMapper objectMapper = new ObjectMapper();
StringWriter stringWriter = new StringWriter();
JsonGenerator jsonGenerator;
try {
jsonGenerator = objectMapper.getJsonFactory().createJsonGenerator(stringWriter);
objectMapper.writeValue(jsonGenerator, objBean);
jsonStr = stringWriter.toString();
if (null != jsonGenerator) {
jsonGenerator.flush();
}
if (null != stringWriter) {
stringWriter.flush();
}
if (null != jsonGenerator) {
jsonGenerator.close();
}
jsonGenerator = null;
objectMapper = null;
} catch (IOException e) {
}
return jsonStr;
}
}
Gson實作
package haha.json;
import com.google.gson.Gson;
public classGsonTest {
publicstaticString BeanToString(Object obj) {
Gson gson = new Gson();
return gson.toJson(obj);
}
}
測試VO類
package haha.json;
import java.math.BigDecimal;
import java.util.Date;
public class JsonBeanVO {
private int id;
private String name;
private String desc;
private String remark;
private Date createTime;
private Date endTime;
private BigDecimal price;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name){
this.name = name;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc){
this.desc = desc;
}
public String getRemark() {
return remark;
}
public void setRemark(Stringremark) {
this.remark = remark;
}
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(DatecreateTime) {
this.createTime =createTime;
}
public Date getEndTime() {
return endTime;
}
public void setEndTime(DateendTime) {
this.endTime = endTime;
}
public BigDecimal getPrice() {
return price;
}
public void setPrice(BigDecimalprice) {
this.price = price;
}
}
測試代碼
package haha.json;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
public classTest {
publicstaticvoidmain(String []args){
JsonBeanVO vo=new JsonBeanVO();
vo.setId(11);
vo.setName("hahhah");
vo.setDesc("hehehe");
vo.setRemark("remark");
vo.setPrice(new BigDecimal("1.1314"));
vo.setCreateTime(new Date());
vo.setEndTime(new Date());
List<JsonBeanVO> list=newArrayList<JsonBeanVO>(10);
for (int i = 0; i < 10; i++) {
list.add(vo);
}
Long fastJsonStart=System.currentTimeMillis();
FastJsonTest.beanToJson(list);
System.out.println("fastJson Time:"+(System.currentTimeMillis()-fastJsonStart));
Long jacksonStart=System.currentTimeMillis();
JacksonTest.beanToJson(list);
System.out.println("Jackson Time:"+(System.currentTimeMillis()-jacksonStart));
Long gsonStart =System.currentTimeMillis();
GsonTest.BeanToString(list);
System.out.println("Gson Time:"+(System.currentTimeMillis()-gsonStart));
}
}
測試結果
1,當數組的大小為10時:
2,當數組的大小為100時:
3,當數組的大小為1000時:
4,當數組的大小為1
0000時:
5,當數組的大小為100000時:
6,當數組的大小為1000000時:
7,當數組的大小為10000000時:FastJson能正常解析,Jackson和Gson直接記憶體溢出了(注:本人電腦記憶體比較小,4G的)
通過以上測試資料得出結論:
1, 不管是哪種json解析方式,效率都說不上高,是以盡可能少用;
2, 在資料量很小的時候,Gson效率最高,但随着資料量的增加,效率下降也最快;
3, FastJson在大資料量方面相對表現最好,從小資料量到資料量增加效率上也比其它兩個更高。
是以如果項目一定要用到json解析的話,綜合考量應選擇FastJson,當然最好能根據資料量選擇Gson或者FastJson