net.sf.json.JSONArray.fromObject() 效率问题

一、问题描述 

        在一次pinpoint分析中,发现net.sf.json.JSONArray.fromObject()方法,居然耗时近1秒,当时的场景是fromObject一个list转成JSONArray,然后再toString(),list中有1万1左右的对象。

        于是,开始写测试方法,对net.sf.json.JSONArray.fromObject()进行验证。

二、验证过程

jar包依赖:

  1. <dependency>
  2. <groupId>net.sf.json-lib</groupId>
  3. <artifactId>json-lib</artifactId>
  4. <version>2.4</version>
  5. <classifier>jdk15</classifier>
  6. </dependency>
  7. <dependency>
  8. <groupId>com.alibaba</groupId>
  9. <artifactId>fastjson</artifactId>
  10. <version>1.2.47</version>
  11. </dependency>

1、先创建一个User.java类

  1. import java.util.Date;
  2. public class User {
  3. private Date createTime;
  4. private String name;
  5. private Integer age;
  6. private Long id;
  7. public Date getCreateTime() {
  8. return createTime;
  9. }
  10. public void setCreateTime(Date createTime) {
  11. this.createTime = createTime;
  12. }
  13. public String getName() {
  14. return name;
  15. }
  16. public void setName(String name) {
  17. this.name = name;
  18. }
  19. public Integer getAge() {
  20. return age;
  21. }
  22. public void setAge(Integer age) {
  23. this.age = age;
  24. }
  25. public Long getId() {
  26. return id;
  27. }
  28. public void setId(Long id) {
  29. this.id = id;
  30. }
  31. }

2、再写一个测试类

为了做对比,引入了com.alibaba.fastjson.JSONObject.toJSONString()方法,进行比较

  1. import java.util.ArrayList;
  2. import java.util.Date;
  3. import java.util.List;
  4. public class TestJSONArray {
  5. public static void main(String[] args) {
  6. TestJSONArray.test();
  7. }
  8. public static void test(){
  9. List<User> list = new ArrayList<User>();
  10. for (int i = 0; i < 10; i++) {
  11. User user = new User();
  12. user.setId((long) i);
  13. user.setName("我是程序员" + i);
  14. user.setAge(i);
  15. user.setCreateTime(new Date());
  16. list.add(user);
  17. }
  18. long startTime=System.currentTimeMillis();
  19. net.sf.json.JSONArray jsonArray = net.sf.json.JSONArray.fromObject(list);
  20. long endTime=System.currentTimeMillis();
  21. System.out.println("net.sf.json.JSONArray.fromObject()运行花费了: "+(endTime-startTime)+"毫秒");
  22. long startTime2=System.currentTimeMillis();
  23. jsonArray.toString();
  24. long endTime2=System.currentTimeMillis();
  25. System.out.println("jsonArray.toString()运行花费了: "+(endTime2-startTime2)+"毫秒");
  26. long startTime3=System.currentTimeMillis();
  27. com.alibaba.fastjson.JSONObject.toJSONString(list);
  28. long endTime3=System.currentTimeMillis();
  29. System.out.println("com.alibaba.fastjson.JSONObject.toJSONString()运行花费了: "+(endTime3-startTime3)+"毫秒");
  30. }
  31. }

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()

相差
10269毫秒153毫秒116毫秒
100286毫秒163毫秒123毫秒
200363毫秒201毫秒162毫秒
300630毫秒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包组件去实现,这样能提升一定的性能。