最近在分析Java服务性能时,发现在处理数据时大量解析JSON占用的CPU资源比较大,想看看不同方法之间是否有性能上的差异。编写了一小段代码测试,对比结果基本没有差别。
fastjson库版本和引用如下:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.75</version>
</dependency>
对象定义:
public class IotDef {
public long ts;
public String tag;
public float v;
public int updatecount;
}
JSONObject parseObject(String text)测试方法:
public void jsonTest() {
long ls = (new Date()).getTime();
float f = 0;
for ( int i = 0; i < 1000_0000; i ++ )
{
String json = "{\"ts\":"+i+",\"tag\":\""+"Tag"+i%1000+"\",\"v\":"+i/123.0+",\"updatecount\":"+i%10000+"}";
JSONObject jo = JSONObject.parseObject(json);
f += jo.getFloat("v");
}
long ls2 = (new Date()).getTime();
System.out.println("v:"+f+" ,duration:"+(ls2-ls)/1000.0);
}
<T> T parseObject(String text, Class<T> clazz)测试方法:
public void jsonTest() {
long ls = (new Date()).getTime();
float f = 0;
for ( int i = 0; i < 1000_0000; i ++ )
{
String json = "{\"ts\":"+i+",\"tag\":\""+"Tag"+i%1000+"\",\"v\":"+i/123.0+",\"updatecount\":"+i%10000+"}";
IotDef jo = JSONObject.parseObject(json,IotDef.class);
f += jo.v;
}
long ls2 = (new Date()).getTime();
System.out.println("v:"+f+" ,duration:"+(ls2-ls)/1000.0);
}
系统配置和运行时性能:
从图上可以看到,虽然是单线程测试,但内部解析多个CPU核处理多有影响。
打包,采用java -jar jsontest.jar运行,每种3次共6次测试结果如下,看不到明显差别。
v:3.91234257E11 ,duration:12.157
v:3.91234257E11 ,duration:12.776
v:3.91234257E11 ,duration:13.003
v:3.91234257E11 ,duration:12.599
v:3.91234257E11 ,duration:12.381
v:3.91234257E11 ,duration:12.67