Java Bean Copy 性能大比拼

简介

Bean 拷贝在工作中被大量使用,可以大幅度的提高工作量。本文对常用的 Bean copy 工具进行了压力测试,方便大家选择更加适合自己的工具。本篇文章是mica cglib 增强——【01】cglib bean copy 介绍 续篇,该专栏会持续更新,感兴趣的朋友请订阅我们。

bean 拷贝工具

  • MapStruct (编译期生成 Mapper 实现)
  • Selma (编译期生成 Mapper 实现)
  • yangtu222 - BeanUtils (第一次生成 copy 实现字节码)
  • mica (第一次生成 copy 实现字节码)
  • hutool (反射)

模型

无类型转换

/*** 来源用户** @author L.cm*/
@Data
public class FormUser {private Long id;private String nickName;private Integer age;private String phone;private String email;private String password;private Integer gender;private String avatar;
}/*** 转换的用户** @author L.cm*/
@Data
public class ToUser {private String nickName;private String phone;private String email;private Integer gender;private String avatar;
}

带类型转换

/*** 附带类型转换的 用户模型** @author L.cm*/
@Data
@Accessors(chain = true)
public class FormConvertUser {private Long id;private String nickName;private Integer age;private String phone;private String email;private String password;private Integer gender;private String avatar;@DateTimeFormat(pattern = DateUtil.PATTERN_DATETIME)private LocalDateTime birthday;
}/*** 附带类型转换的 用户模型** @author L.cm*/
@Data
@Accessors(chain = true)
public class ToConvertUser {private String nickName;private Integer age;private String phone;private String email;private String password;private Integer gender;private String avatar;private String birthday;
}

Bean copy 压测结果

环境

  • OS: macOS Mojave
  • CPU: 2.8 GHz Intel Core i5
  • RAM: 8 GB 1600 MHz DDR3
  • JVM: Oracle 1.8.0_201 64 bits

简单模型

Benchmark Mode Cnt Score Error Units
hutoolBeanCopy thrpt 5 1939.092 ± 26.747 ops/ms
springBeanCopy thrpt 5 3569.035 ± 39.607 ops/ms
cglibBeanCopy thrpt 5 9112.785 ± 560.503 ops/ms
micaBeanCopy thrpt 5 17753.409 ± 393.245 ops/ms
yangtu222BeanCopy thrpt 5 18201.997 ± 119.189 ops/ms
cglibMapperBeanCopy thrpt 5 37679.510 ± 3544.624 ops/ms
mapStructBeanCopy thrpt 5 50328.045 ± 529.707 ops/ms
selmaBeanCopy thrpt 5 200859.561 ± 2370.531 ops/ms

附带类型转换(日期)

Benchmark Mode Cnt Score Error Units
micaBeanCopy thrpt 5 1186.375 ± 64.686 ops/ms
mapStructBeanCopy thrpt 5 1623.478 ± 13.894 ops/ms
selmaBeanCopy thrpt 5 160020.595 ± 2570.747 ops/ms

列表模型(100 item)

Benchmark Mode Cnt Score Error Units
springBeanCopy thrpt 5 35.974 ± 0.555 ops/ms
micaBeanCopy thrpt 5 169.066 ± 5.460 ops/ms

Map 拷贝到 bean

Benchmark Mode Cnt Score Error Units
hutoolBeanCopy thrpt 5 1338.551 ± 16.746 ops/ms
micaBeanCopy thrpt 5 13577.056 ± 27.795 ops/ms

结论

和 java-object-mapper-benchmark 测试结果有些出入。

Selma 的表现反而比 MapStruct 更好,可能是模型不一样导致的。

功能比较

工具包 需要编写Mapper 支持Map 支持List、Set 类型转换 性能
Selma 需要手写转换 极高
MapStruct 支持常用类型和复杂表达式 极高
BeanUtils(yangtu222) 需要手写转换 极高
mica 是用 Spring 的类型转换 极高
Spring 不支持
hutool 不支持

链接

本项目源码:https://github.com/lets-mica/mica-jmh

开源推荐

  • Spring boot 微服务高效开发 mica 工具集:https://gitee.com/596392912/mica
  • Avue 一款基于vue可配置化的神奇框架:https://gitee.com/smallweigit/avue
  • pig 宇宙最强微服务(架构师必备):https://gitee.com/log4j/pig
  • SpringBlade 完整的线上解决方案(企业开发必备):https://gitee.com/smallc/SpringBlade
  • IJPay 支付SDK让支付触手可及:https://gitee.com/javen205/IJPay

关注我们

扫描上面二维码,更多精彩内容每天推荐!

Java Bean Copy 性能大比拼相关推荐

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

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

  2. Node和java和php,服务端I/O性能大比拼:Node、PHP、Java和Go(三)

    服务端I/O性能大比拼:Node.PHP.Java和Go(三) 服务端I/O性能大比拼:Node.PHP.Java和Go(三) 谎言,诅咒的谎言和基准 对这些各种模式的上下文切换进行准确的定时是很困难 ...

  3. node和java性能_服务端I/O性能大比拼:Node、PHP、Java和Go(二)

    服务端I/O性能大比拼:Node.PHP.Java和Go(二) 服务端I/O性能大比拼:Node.PHP.Java和Go(二) ### 多线程的方式:Java 所以就在你买了你的第一个域名的时候,Ja ...

  4. cglib、orika、spring等bean copy工具性能测试和原理分析

    简介 在实际项目中,考虑到不同的数据使用者,我们经常要处理 VO.DTO.Entity.DO 等对象的转换,如果手动编写 setter/getter 方法一个个赋值,将非常繁琐且难维护.通常情况下,这 ...

  5. 从 java bean 的内省到 dbutils 的应用

    java bean 内省的基础 java bean 的内省,其实可以算是反射的一种基础应用,关于 java 的反射,无非就是获得对应的类.属性.方法.修饰符等的应用,对于 java 的反射探讨,可以点 ...

  6. Java IOUtils.copy方法代码示例(亲测)

    本文整理汇总了Java中org.apache.commons.io.IOUtils.copy方法的典型用法代码示例.如果您正苦于以下问题:Java IOUtils.copy方法的具体用法?Java I ...

  7. java和golang性能_Java本质和性能

    java和golang性能 最初的问题是如何计算二进制数中1的个数? 我包含了使用Integer.bitCount()的性能比较,该性能可以转换为固有特性,即单个机器代码指令POPCNT和执行相同功能 ...

  8. java bean spring_Java bean与Spring、Spring MVC关系

    Java Bean Java语言欠缺属性.事件.多重继承功能.所以,如果要在Java程序中实现一些面向对象编程的常见需求,只能手写大量胶水代码.Java Bean正是编写这套胶水代码的惯用模式或约定. ...

  9. java manualbuffer_FlatBuffer Java Bean自由转换

    性能-来自谷歌 FlatBuffers (binary) Protocol Buffers LITE Rapid JSON FlatBuffers (JSON) pugixml Raw structs ...

  10. Java Bean 转 Map 的巨坑,注意了!!!

    一.背景 有些业务场景下需要将 Java Bean 转成 Map 再使用. 本以为很简单场景,但是坑很多. 二.那些坑 2.0 测试对象 i mport lombok.Data; import jav ...

最新文章

  1. $.when().done().then()的用法
  2. python画长方形-怎么用python 画出任意占空比的一串矩形方波呢?
  3. linux x64 asm 参数传递,NASM汇编学习系列(1)——系统调用和参数传递
  4. 【C语言简单说】十:小结
  5. nginx php 不能连接mysql_nginx配置php环境,并测试PHP是否可以连接mysql
  6. php 三个点 三角形面积,知道三角形三个顶点坐标,求面积,我觉得我的没错,但未通过,麻烦大佬帮忙看下...
  7. python traceback_Python 列表操作,节后大放送
  8. SpringCloud_005_Maven中的Scope详解_准备01
  9. 使用DataX同步MaxCompute数据到TableStore(原OTS)优化指南
  10. linux中的特殊符号 (|) 管道。
  11. 【百度贾磊】汉语语音识别技术重大突破:LSTM+CTC详解(22PPT)
  12. Object Detection︱RCNN、faster-RCNN框架的浅读与延伸内容笔记
  13. 笔记本如何查看mac地址
  14. 10 Python - Python列表list
  15. 万能地图下载器下载谷歌卫星地图在ArcGIS中套合
  16. 路由器的两个端口接在同一个交换机上_什么是路由器交换机?路由器交换机介绍!...
  17. 我们经常看到的”缺省“是什么意思
  18. 教程 | 用Python识别图片验证码中的文字
  19. 操作系统原理:哲学家就餐经典问题
  20. 浅谈XMLHttpRequest

热门文章

  1. 极客大学产品经理训练营 产品思维和产品意识(上) 第3课总结
  2. 优先深度搜索判断曲线相交_深度优先搜索(Depth-first search)是如何搜索一张图的?...
  3. 2021-09-13Top-N 推荐系统,通常指的是个性化推荐系统,有别于热门推荐。
  4. python函数参数用法_Python:函数参数类型及其用法
  5. vscode 头文件包含问题_VScode编译C++ 头文件显示not found的问题
  6. python中转义符的用法_一篇文章搞懂python的转义字符及用法
  7. 解决github访问慢
  8. win10电脑显示无法自动修复此计算机,win10系统无法自动修复此计算机的操作步骤...
  9. BurpSuite Pro 2021.2 最新版本
  10. android手机和荣耀哪个版本好,【求测评】荣耀v40轻奢版与荣耀X10哪款更好?图文爆料分析...