一、问题描述
在一次pinpoint分析中,发现net.sf.json.JSONArray.fromObject()方法,居然耗时近1秒,当时的场景是fromObject一个list转成JSONArray,然后再toString(),list中有1万1左右的对象。
于是,开始写测试方法,对net.sf.json.JSONArray.fromObject()进行验证。
二、验证过程
jar包依赖:
<dependency>
<groupId>net.sf.json-lib</groupId>
<artifactId>json-lib</artifactId>
<version>2.4</version>
<classifier>jdk15</classifier>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.47</version>
</dependency>
1、先创建一个User.java类
import java.util.Date;
public class User {
private Date createTime;
private String name;
private Integer age;
private Long id;
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
}
2、再写一个测试类
为了做对比,引入了com.alibaba.fastjson.JSONObject.toJSONString()方法,进行比较
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
public class TestJSONArray {
public static void main(String[] args) {
TestJSONArray.test();
}
public static void test(){
List<User> list = new ArrayList<User>();
for (int i = 0; i < 10; i++) {
User user = new User();
user.setId((long) i);
user.setName("我是程序员" + i);
user.setAge(i);
user.setCreateTime(new Date());
list.add(user);
}
long startTime=System.currentTimeMillis();
net.sf.json.JSONArray jsonArray = net.sf.json.JSONArray.fromObject(list);
long endTime=System.currentTimeMillis();
System.out.println("net.sf.json.JSONArray.fromObject()运行花费了: "+(endTime-startTime)+"毫秒");
long startTime2=System.currentTimeMillis();
jsonArray.toString();
long endTime2=System.currentTimeMillis();
System.out.println("jsonArray.toString()运行花费了: "+(endTime2-startTime2)+"毫秒");
long startTime3=System.currentTimeMillis();
com.alibaba.fastjson.JSONObject.toJSONString(list);
long endTime3=System.currentTimeMillis();
System.out.println("com.alibaba.fastjson.JSONObject.toJSONString()运行花费了: "+(endTime3-startTime3)+"毫秒");
}
}
3、修改for循次数,加入不同的数量进行测试
list中10个User对象,结果如下:
list中100个User对象,结果如下:
list中1000个User对象,结果如下:
list中1万个User对象,结果如下:
4、结果对比
list中的size | net.sf.json.JSONArray.fromObject() | com.alibaba.fastjson.JSONObject.toJSONString() | 相差 |
10 | 269毫秒 | 153毫秒 | 116毫秒 |
100 | 286毫秒 | 163毫秒 | 123毫秒 |
200 | 363毫秒 | 201毫秒 | 162毫秒 |
300 | 630毫秒 | 248毫秒 | 382毫秒 |
通过结果对比,发现net.sf.json.JSONArray.fromObject()性能不如com.alibaba.fastjson.JSONObject.toJSONString()性能,而且随数据量的增大,性能相差越大。
于是,把代码里相关用到net.sf.json.JSONArray的地方,全局替换成com.alibaba.fastjson.JSONObject,同时做业务功能验证。
三、结论
net.sf.json.JSONArray.fromObject()性能不如com.alibaba.fastjson.JSONObject.toJSONString()性能,而且随数据量的增大,性能相差越大。
不仅仅是JSONArray.fromObject()一个方法的性能问题,net.sf.json整个包组件的性能,不如com.alibaba.fastjson包组件的性能。
能用com.alibaba.fastjson包组件实现的功能,就不要用net.sf.json包组件去实现,这样能提升一定的性能。