Java Bean Copy 性能大比拼

简介

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

bean 拷贝工具

模型

无类型转换

1/** 2 * 来源用户 3 * 4 * @author L.cm 5 */ 6@Data 7public 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 * 21 * @author L.cm 22 */ 23@Data 24public class ToUser { 25 private String nickName; 26 private String phone; 27 private String email; 28 private Integer gender; 29 private String avatar; 30}

带类型转换

1/** 2 * 附带类型转换的 用户模型 3 * 4 * @author L.cm 5 */ 6@Data 7@Accessors(chain = true) 8public 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 * 24 * @author L.cm 25 */ 26@Data 27@Accessors(chain = true) 28public class ToConvertUser { 29 private String nickName; 30 private Integer age; 31 private String phone; 32 private String email; 33 private String password; 34 private Integer gender; 35 private String avatar; 36 private String birthday; 37}

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

hutool

thrpt

5

1939.092 ±

26.747

ops/ms

spring

thrpt

5

3569.035 ±

39.607

ops/ms

cglib

thrpt

5

9112.785 ±

560.503

ops/ms

mica

thrpt

5

17753.409 ±

393.245

ops/ms

yangtu222 BeanUtils

thrpt

5

18201.997 ±

119.189

ops/ms

cglibMapper

thrpt

5

37679.510 ±

3544.624

ops/ms

mapStruct

thrpt

5

50328.045 ±

529.707

ops/ms

selma

thrpt

5

200859.561 ±

2370.531

ops/ms

附带类型转换(日期)

Benchmark

Mode

Cnt

Score

Error

Units

mica

thrpt

5

1186.375 ±

64.686

ops/ms

mapStruct

thrpt

5

1623.478 ±

13.894

ops/ms

selma

thrpt

5

160020.595 ±

2570.747

ops/ms

列表模型(100 item)

Benchmark

Mode

Cnt

Score

Error

Units

spring

thrpt

5

35.974 ±

0.555

ops/ms

mica

thrpt

5

169.066 ±

5.460

ops/ms

Map 拷贝到 bean

Benchmark

Mode

Cnt

Score

Error

Units

hutool

thrpt

5

1338.551 ±

16.746

ops/ms

mica

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

码云开源推荐

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

Java日期时间API系列31

  时间戳是指格林威治时间1970年01月01日00时00分00秒起至现在的总毫秒数,是所有时间的基础,其他时间可以通过时间戳转换得到。Java中本来已经有相关获取时间戳的方法,Java8后增加新的类Instant等专用于处理时间戳问题。 1获取时间戳的方法和性能对比1.1获取时间戳方法Java8以前