「这是我参与11月更文挑战的第18天,活动详情查看:2021最后一次更文挑战」。
1.前言
Hello 大家好,我是l拉不拉米
,在上一篇文章《Java五大对象映射框架,总有一款适合你😘》中,给大家分享Java五大映射框架的介绍以及简单使用,今天我们以性能
为指标,来给这5个对象映射框架较个高低。
- 测试模型
为了能够正确地测试映射,我们需要有源模型
和目标模型
。我们创建了两个测试模型。
第一个只是一个带有一个 String 字段的简单 POJO,这允许我们在更简单的情况下比较框架,并检查如果我们使用更复杂的 bean 是否有任何变化。
简单的源模型如下所示:
1 | java复制代码public class SourceCode { |
目标模型如下:
1 | java复制代码public class DestinationCode { |
源 bean 的真实示例如下:
1 | java复制代码public class SourceOrder { |
目标类如下:
1 | java复制代码public class Order { |
3.测试结果
使用Java基准测试神器 – JMH
(Java Microbenchmark Harness)作为测试工具。
我们为每个转换器创建了一个单独的基准,将 BenchmarkMode 指定为 Mode.All
。
3.1.平均时间
JMH 返回了以下平均运行时间的结果(越少越好
):
框架名称 | 平均运行时间 (单位:ms) |
---|---|
MapStruct | 10 -5 |
JMapper | 10 -5 |
Orika | 0.001 |
ModelMapper | 0.001 |
Dozer | 0.002 |
该基准明显地显示了MapStruct
和JMapper
都有最好的平均工作时间。
3.2.吞吐量
在此模式下,该基准测试返回每秒的操作数。我们收到以下结果(更多更好
):
框架名称 | 吞吐量 (每毫秒操作次数) |
---|---|
MapStruct | 133719 |
JMapper | 106978 |
Orika | 1800 |
ModelMapper | 978 |
Dozer | 471 |
在吞吐量模式下,MapStruct
是框架测试中最快的,JMapper
次之。
3.3.单发时间
此模式允许测量从它开始到结束的单个操作的时间。该基准得到以下结果(更少更好
):
框架名称 | 单发时间 (每操作毫秒数) |
---|---|
JMapper | 0.015 |
MapStruct | 0.450 |
Dozer | 2.094 |
Orika | 2.898 |
ModelMapper | 4.837 |
我们看到JMapper
比MapStruct
返回更好的结果。
3.4.采样时间
此模式允许对每个操作的时间进行采样。三种不同百分位数的结果如下:
采样时间 (单位:ms) | |||
---|---|---|---|
框架名称 | p0.90 | p0.999 | p1.0 |
JMapper | 10-4 | 0.001 | 2.6 |
MapStruct | 10-4 | 0.001 | 3 |
Orika | 0.001 | 0.010 | 4 |
ModelMapper | 0.002 | 0.015 | 3.2 |
Dozer | 0.003 | 0.021 | 25 |
所有基准测试都显示,Mapstruct
和JMapper
根据场景不同都是个好选择。
4.结论
通过简单的理想环境下的测试结果,我们可以得出Mapstruct
和JMapper
性能较接近,但是Mapstruct
易用性更强,JMapper
更小众,因此,笔者更加推荐使用Mapstruct
。
其他三种框架表现和前两名的差距较大,不做推荐。
本文转载自: 掘金