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包依赖:

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

相差
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包组件去实现,这样能提升一定的性能。

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值