简介

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

bean 拷贝工具

模型

无类型转换

  1. /**
  2. * 来源用户
  3. *
  4. * @author L.cm
  5. */
  6. @Data
  7. public class FormUser {
  8. private Long id;
  9. private String nickName;
  10. private Integer age;
  11. private String phone;
  12. private String email;
  13. private String password;
  14. private Integer gender;
  15. private String avatar;
  16. }
  17. /**
  18. * 转换的用户
  19. *
  20. * @author L.cm
  21. */
  22. @Data
  23. public class ToUser {
  24. private String nickName;
  25. private String phone;
  26. private String email;
  27. private Integer gender;
  28. private String avatar;
  29. }

带类型转换

  1. /**
  2. * 附带类型转换的 用户模型
  3. *
  4. * @author L.cm
  5. */
  6. @Data
  7. @Accessors(chain = true)
  8. public class FormConvertUser {
  9. private Long id;
  10. private String nickName;
  11. private Integer age;
  12. private String phone;
  13. private String email;
  14. private String password;
  15. private Integer gender;
  16. private String avatar;
  17. @DateTimeFormat(pattern = DateUtil.PATTERN_DATETIME)
  18. private LocalDateTime birthday;
  19. }
  20. /**
  21. * 附带类型转换的 用户模型
  22. *
  23. * @author L.cm
  24. */
  25. @Data
  26. @Accessors(chain = true)
  27. public class ToConvertUser {
  28. private String nickName;
  29. private Integer age;
  30. private String phone;
  31. private String email;
  32. private String password;
  33. private Integer gender;
  34. private String avatar;
  35. private String birthday;
  36. }

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

开源推荐

关注我们

如梦技术-公众号.jpg

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