一、问题描述
在一次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包组件去实现,这样能提升一定的性能。