Java Bean Copy 性能大比拼

简介

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

bean 拷贝工具

•MapStruct (编译期生成 Mapper 实现)[1]•Selma (编译期生成 Mapper 实现)[2]•yangtu222 - BeanUtils (第一次生成 copy 实现字节码)[3]•mica (第一次生成 copy 实现字节码)[4]•hutool (反射)[5]

模型

无类型转换
































/** * 来源用户 * * @author L.cm */@Datapublic 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 */@Datapublic 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 Score Error Units
hutool 1939.092 26.747 ops/ms
spring 3569.035 39.607 ops/ms
cglib 9112.785 560.503 ops/ms
mica 17753.409 393.245 ops/ms
yangtu222 18201.997 119.189 ops/ms
cglibMapper 37679.510 3544.624 ops/ms
mapStruct 50328.045 529.707 ops/ms
selma 200859.561 2370.531 ops/ms

附带类型转换(日期)

Benchmark Score Error Units
mica 1186.375 64.686 ops/ms
mapStruct 1623.478 13.894 ops/ms
selma 160020.595 2570.747 ops/ms

列表模型(100 item)

Benchmark Score Error Units
spring 35.974 0.555 ops/ms
mica 169.066 5.460 ops/ms

Map 拷贝到 bean

Benchmark Score Error Units
hutool 1338.551  16.746 ops/ms
mica 13577.056  27.795 ops/ms

结论

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

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

功能比较

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


上一篇:c#学习第二天


下一篇:Java进阶篇设计模式之六 - 组合模式和过滤器模式