BeanUtils.copyProperties 和 fastjson 性能对比

本贴最后更新于 1871 天前,其中的信息可能已经时移世易

BeanUtils.copyProperties 和 fastjson 性能对比

声明

测试方法非严格方式, 测试结果以及结论仅供参考!
测试方法非严格方式, 测试结果以及结论仅供参考!
测试方法非严格方式, 测试结果以及结论仅供参考!

测试环境

  • cpu: i5-8400(6c 6t 3.8 主频)
  • 内存: 16*2(2666 频率)
  • 系统: 10.14.6 (18G95)

测试样本

用 json 输出大概是 7kb

对比测试方法

BeanUtils.copyProperties 有的字段无法正确复制, 我们用 json 序列化(兼容性好)来进行对比测试
json 工具使用的是阿里 fastJson

由于测试循环中加入了一个检测是否新建对象的逻辑(防止程序自动优化出现假的字段拷贝), 所以实际执行时间会比给出的测试耗时要稍微短一点

第一轮测试(10 次循环)

测试次数

10 次循环

测试结果

测试结果相差无几, 有时 BeanUtils 快点, 有时 json 的方式快点, 应该是样本量太小导致成绩受系统波动的影响太大
fa696c5fceccd831ffbc49bf4f9fdb88.png

第二轮测试(100 次循环)

测试次数

100 次循环

测试结果

序号 方式 耗时
1 BeanUtils 4ms
1 json 41ms
2 BeanUtils 4ms
2 json 47ms
3 BeanUtils 1ms
3 json 13ms
4 BeanUtils 1ms
4 json 11ms

已经体现出一些差距了

第三轮测试(1000 次循环)

测试次数

1000 次循环

测试结果

序号 方式 耗时
1 BeanUtils 8ms
1 json 110ms
2 BeanUtils 3ms
2 json 61ms
3 BeanUtils 2ms
3 json 67ms
4 BeanUtils 3ms
4 json 67ms

1000 次循环的轻度下大约是 20 倍的性能差距, 不过波动还是比较大, 我们继续增加次数

第四轮测试(10000 次循环)

测试次数

10000 次循环

测试结果

序号 方式 耗时
1 BeanUtils 33ms
1 json 638ms
2 BeanUtils 33ms
2 json 643ms
3 BeanUtils 25ms
3 json 621ms
4 BeanUtils 31ms
4 json 630ms

还是大约是 20 倍左右的性能差距, 第三组蹦跶到快 25 倍了

第五轮测试(200000 次循环)

测试次数

200000 次循环

测试结果

a837ccc5d9470fa00978e00375403a29.png
4f9585f345df0f7a5329e19e462276e1.png
899e3f5069b2746bf32e61898db80ec9.png
fc257db736b8011ac9ba27fbeeabc8dd.png

依旧是 20 倍左右的差距, 循环 200000 次但新建对象不是预期的 200000 而总是少 10 个左右...

结论

使用 BeanUtils 自动复制字段, 性能大概是 json序列化 方式复制字段的 20倍, 不过如果对象不是十分复杂, 这个差距可以接受, 性能不敏感的话可以考虑使用 json序列化 的方式进行字段复制

源码

测试关键逻辑源码

final int testNums = 200000;
    Map<String, String> map = Maps.newHashMap("key", "value");
    long startTime1 = nowMillis();
    int num = testNums;
    int count = 0;
    while (num > 0) {
        num--;
        count++;
        Page<EvaluationUserWithResult> tempReturnPage = new Page<>();
        BeanUtils.copyProperties(evaluationUserPage, tempReturnPage);
        map.put(tempReturnPage.hashCode() + "", tempReturnPage.hashCode() +"");

    }
    log.error("beanutil循环{}次, 新建临时对象{}个, 用时{}", count, map.size()-1, DateTimeStyle.duration(startTime1));


    long startTime2 = nowMillis();
    num = testNums;
    map = Maps.newHashMap("key", "value");
    count = 0;
    while (num > 0) {
        num--;
        count++;
        Page<EvaluationUserWithResult> tempReturnPage = new Page<>();
        tempReturnPage = JSON.parseObject(JSON.toJSONString(evaluationUserPage), tempReturnPage.getClass());
        map.put(tempReturnPage.hashCode() + "", tempReturnPage.hashCode() +"");
    }
    log.error("json循环{}次, 新建临时对象{}个, 用时{}", count, map.size()-1, DateTimeStyle.duration(startTime2));

样本数据

{
    "code": 0,
    "msg": "成功",
    "data": {
        "itemsWithResult": [
            {
                "maxProgress": 6,
                "hmoId": "CYH3211204110000",
                "medChannel": 2,
                "updateTime": 1569746589000,
                "evaluationTime": 1569746589000,
                "userName": "202",
                "itemsResult": {
                    "bc": "",
                    "op": "较高风险",
                    "dyslipemia": "高危",
                    "diab": "已患病",
                    "lungcnacer": "暂无风险",
                    "stroke": "中危人群",
                    "cvd": "较高风险",
                    "pc": "暂无风险",
                    "sportrisk": "较高风险",
                    "hbp": "高风险",
                    "疾病类型": "疾病风险程度",
                    "depression": "可能有重度抑郁倾向",
                    "obesity": "正常"
                },
                "userAge": 39,
                "evaluationId": "8a3147b08opsf878da8622525389fd26",
                "userUnit": "gryh",
                "createTime": 1569745748000,
                "medChannelDesc": "医生录入",
                "userMobile": "99300000202",
                "progress": 6,
                "personId": "test2",
                "userGender": 1,
                "id": 546,
                "evaluationKey": "PersonalHealthRiskEvaluation",
                "evaluationState": 1
            },
            {
                "maxProgress": 6,
                "hmoId": "CYH3211204110000",
                "medChannel": 2,
                "updateTime": 1569745630000,
                "evaluationTime": 1569745629000,
                "userName": "32423",
                "itemsResult": {
                    "bc": "",
                    "op": "较低风险",
                    "dyslipemia": " 低危",
                    "diab": "已患病",
                    "lungcnacer": "暂无风险",
                    "stroke": "高危人群",
                    "cvd": "中等风险",
                    "pc": "高危",
                    "sportrisk": "较高风险",
                    "hbp": "已异常",
                    "疾病类型": "疾病风险程度",
                    "depression": "可能有重度抑郁倾向",
                    "obesity": "正常"
                },
                "userAge": 39,
                "evaluationId": "833a6eac1dbss673f54f44f5c1c62d7a",
                "userUnit": "gryh",
                "createTime": 1563876718000,
                "medChannelDesc": "医生录入",
                "userMobile": "15999999999",
                "progress": 6,
                "personId": "test2",
                "userGender": 1,
                "id": 495,
                "evaluationKey": "PersonalHealthRiskEvaluation",
                "evaluationState": 1
            },
            {
                "maxProgress": 6,
                "hmoId": "CYH3211204110000",
                "medChannel": 2,
                "updateTime": 1563876694000,
                "evaluationTime": 1563876693000,
                "userName": "测试",
                "itemsResult": {
                    "bc": "",
                    "op": "较低风险",
                    "dyslipemia": " 低危",
                    "diab": "高风险",
                    "lungcnacer": " 低危",
                    "stroke": "低危人群",
                    "cvd": "较低风险",
                    "pc": "高危",
                    "sportrisk": "中等风险",
                    "hbp": "中等风险",
                    "疾病类型": "疾病风险程度",
                    "depression": "可能有中重度抑郁倾向",
                    "obesity": "正常"
                },
                "userAge": 39,
                "evaluationId": "2a9ggg508e47412fc5cc092d7ae7c05e",
                "userUnit": "gryh",
                "createTime": 1557737311000,
                "medChannelDesc": "医生录入",
                "userMobile": "15999930566",
                "progress": 6,
                "personId": "test1",
                "userGender": 1,
                "id": 487,
                "evaluationKey": "PersonalHealthRiskEvaluation",
                "evaluationState": 1
            },
            {
                "maxProgress": 7,
                "hmoId": "CYH3211204110000",
                "medChannel": 1,
                "updateTime": 1562763683000,
                "evaluationTime": 1557473650000,
                "userName": "测试2",
                "itemsResult": {
                    "bc": "较高风险",
                    "op": "较低风险",
                    "dyslipemia": " 低危",
                    "diab": "高风险",
                    "lungcnacer": "暂无风险",
                    "stroke": "低危人群",
                    "cvd": "高风险",
                    "pc": "",
                    "sportrisk": "较低风险",
                    "hbp": "高风险",
                    "疾病类型": "疾病风险程度",
                    "depression": "可能有中度抑郁倾向",
                    "obesity": "超重"
                },
                "userAge": 39,
                "evaluationId": "ba8cd69396f3603e6e7b27e7f77d5a4a",
                "userUnit": "gryh",
                "createTime": 1557473530000,
                "medChannelDesc": "用户填写",
                "userMobile": "手机号2",
                "progress": 7,
                "personId": "test3",
                "userGender": 2,
                "id": 483,
                "evaluationKey": "PersonalHealthRiskEvaluation",
                "evaluationState": 4
            },
            {
                "maxProgress": 6,
                "hmoId": "CYH3211204110000",
                "medChannel": 1,
                "updateTime": 1557473641000,
                "evaluationTime": 1557473641000,
                "userName": "测试2",
                "itemsResult": {
                    "bc": "",
                    "op": "较低风险",
                    "dyslipemia": " 低危",
                    "diab": "高风险",
                    "lungcnacer": "暂无风险",
                    "stroke": "低危人群",
                    "cvd": "较高风险",
                    "pc": "极高危",
                    "sportrisk": "中等风险",
                    "hbp": "高风险",
                    "疾病类型": "疾病风险程度",
                    "depression": "可能有重度抑郁倾向",
                    "obesity": "超重"
                },
                "userAge": 39,
                "evaluationId": "edf65b5a233cfd2eggf1c548374cde8f",
                "userUnit": "gryh",
                "createTime": 1557473249000,
                "medChannelDesc": "用户填写",
                "userMobile": "手机号2",
                "progress": 6,
                "personId": "test",
                "userGender": 1,
                "id": 482,
                "evaluationKey": "PersonalHealthRiskEvaluation",
                "evaluationState": 1
            }
        ],
        "pageNo": 1,
        "pageSize": 5,
        "pageCount": 3,
        "recordCount": 13
    }
}
  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3187 引用 • 8213 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...