BeanUtils.copyProperties 和 fastjson 性能对比

声明

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

运行环境

  • cpu: i5-8400(6c 6t 3.8主频)
  • 内存: 16G(2666频率)*2
  • 系统: Mac OS 10.14.6 (18G95)
  • java环境: jdk1.8.0_171

测试样本

用json输出大概是7kb

对比测试方法

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

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

第一轮测试(10次循环)

测试次数

10次循环

测试结果

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

第二轮测试(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次循环

测试结果





依旧是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}
}

BeanUtils.copyProperties 和 fastjson 性能对比相关推荐

  1. fastjson jar包_经过性能对比,我发现温少的FastJson真牛。

    前语:不要为了读文章而读文章,一定要带着问题来读文章,勤思考.在此,建议大家为本公众号加"星标".如文章写得好,望大家阅读后在右下边"在看"处点个赞,以示鼓励! ...

  2. 性能篇之对象拷贝工具BeanUtils.copyProperties和BeanCopier.copy的比较

    对象的拷贝在开发过程中肯定非常常见,想必大家使用spring中的BeanUtils.copyProperties来完成的,小编最初也是用习惯了这个工具,但是在一次codereview中,大佬给我提出建 ...

  3. BeanUtils.copyProperties VS PropertyUtils.copyProperties

    1. 通过反射将一个对象的值赋值个另外一个对象(前提是对象中属性的名字相同). 2. BeanUtils.copyProperties(obj1,obj2); 经常闹混不知道是谁给谁赋值,无意中先到& ...

  4. java bean 优缺点_Java Bean Copy框架性能对比

    一.问题分析 背景 相同server机器上的相同方法在方法调用链任何参数都一致的情况消耗时间差别非常大,举例说明,类A有方法demo(), 通过分析发现同一台机器(也是一个jvm进程)对该方法的两次调 ...

  5. BeanUtils.copyProperties() 用法

    转载自 https://blog.csdn.net/jdjdndhj/article/details/62056137 第一步: BeanUtils.copyProperties()与Property ...

  6. BeanUtils.copyProperties()使用详解+在不同包的区别

    一. 两个包下的BeanUtils.copyProperties对比 BeanUtils是开发中常用到的工具类. 而获取这一工具类常用的方法有两种 org.springframework.beans. ...

  7. BeanUtils.copyProperties(对象A,对象B)

    对于两个实例的复制,如果属性名字相同,则可以通过这个方法来操作,但是在使用的时候,一定要注意BeanUtils用的是哪个包的,因为常用的两个包,都有这个类和对应的方法,而复制方向却相反,所以一定要注意 ...

  8. 绝了,几款主流的 JSON 库性能对比!

    本篇通过JMH(Oracle官方测试框架)来测试一下Java中几种常见的JSON解析库的性能.每次都在网上看到别人说什么某某库性能是如何如何的好,碾压其他的库.但是百闻不如一见,只有自己亲手测试过的才 ...

  9. Java kryo/protobuf/protostuff序列化 or Json 性能对比

    Java kryo/protobuf/protostuff序列化 or Json 性能对比 - 腾飞的鹰 - 博客园 对于一个java object的序列化,想测一下使用json和使用一般序列化工具, ...

  10. BeanUtils.copyProperties 无法转换数据类型不同的数据

    背景 @Data public class A{private BigDecimal a; } @Data public class B{private String b; } A a = new A ...

最新文章

  1. 【干货书】深度学习合成数据
  2. 《Linux内核设计与实现》读书笔记(七)- 中断处理【转】
  3. ToolBar Rebar CommandBar
  4. 数据挖掘领域十大经典算法
  5. 计算机d盘无法格式化,电脑D盘无法格式化怎么办 D盘无法格式化问题解决办法...
  6. Client does not support authentication protocol requested by server;
  7. php 正则表达式 匹配中日韩字符(GBK)
  8. Syncfusion教程:在Xamarin.Forms中创建数据输入表单 (4)
  9. 《一天搞懂深度学习》下载
  10. linux 多块网卡 bridge,理解linux虚拟网络设备bridge
  11. gre作文3.5什么水平计算机专业,gre作文3.5分如何达到
  12. 7-88 求一元二次方程的根
  13. 什么是轻量级、重量级框架
  14. 下载Google Play上面的应用
  15. 播客49:Lyle Troxell
  16. [BZOJ4565][Haoi2016]字符合并(区间状压dp)
  17. 操作系统真象还原第一章
  18. Matlab RoboticToolBox(一)Link参数、三自由度/四自由度逆运动学
  19. RocketMQ——查看死信队列
  20. 暴风影音3.11.06.09手动去广告方法 【转】

热门文章

  1. vscode配置maven,settings.json文件
  2. 像素是计算机图像处理的最小单元,图像处理复习
  3. java批量生成条形码图片 打包zip
  4. 中国近代史纲要复盘 | 第一章——第四章思维导图梳理(复习专用)
  5. PS_1_认识主界面_新建文档(分辨率)_打开保存(序列动画)
  6. 2月12日 模拟题 递推 题解
  7. js中的this指向问题
  8. Paper Notes: Cross-Domain Image Translation Based on GAN
  9. 2.try、catch、finally执行顺序 以及final、finally和finalize的区别
  10. html 磁贴自动布局,也来“玩”Metro UI之磁贴(一)_html/css_WEB-ITnose