文章目录
- Java 对象映射框架性能基准测试:九款框架横向对比
- 1、 这个项目解决什么问题
- 2、 覆盖了哪些框架
- 3、 测试环境和数据模型
- 4、 跑出来的分数
- 5、 怎么复现
- 6、 这个仓库的价值在哪
- 7、 一点提醒
Java 对象映射框架性能基准测试:九款框架横向对比
arey/java-object-mapper-benchmark 已经拿到 285 Star,规模不大,但里面装的东西挺实在。
它做的事情很专一,用 JMH 把常见的 Java 对象映射框架拉到一起做了一次跑分对比,跑出来的数据能让做架构选型的人少绕几道弯。
1、 这个项目解决什么问题
分层应用里 DTO 和实体之间来回拷贝是个体力活,字段多了容易写错,维护成本也高。社区里陆续出现了一堆映射框架,思路大致分两类,一类靠反射在运行时拿元数据,另一类靠编译期代码生成旁路掉反射开销。
两类方案到底差多少,光看 README 里的宣传很难形成直觉。这个项目就是把 9 个框架拉到同一台机器、同一份数据模型下,用 JMH 跑 throughput,给出 ops/s 数字让结果可比对。
2、 覆盖了哪些框架
仓库列出的受测框架有 10 个,包括 Dozer、MapStruct、ModelMapper、Selma、Orika、JMapper、BULL、datus、ReMap 和 SJF4J。
按思路归类的话,MapStruct、Selma 依赖编译期代码生成,运行时和手写代码接近;Dozer、ModelMapper、Orika 走反射,灵活但有反射开销;JMapper、datus、ReMap 介于两者之间;SJF4J 是后加入的轻量方案。
3、 测试环境和数据模型
机器配置信息点一下:macOS Tahoe 26.5,Apple M4 Pro,24 GB 内存,Eclipse Temurin 21.0.5+11。
数据模型基础但够用,来自 ModelMapper 项目里一个叫 Comparison 的测试类,覆盖了 Java Bean 里的对象类型和集合两类常见组合,仓库里附了一张 UML 图方便看结构。
4、 跑出来的分数
直接看 results.png 是最快的,仓库里维护了这张图。
把表格关键行抽出来看分层:
第一档是 Manual、SJF4J、MapStruct、Selma,每秒 9200 万到 9800 万 ops,和手写拷贝基本同档,差距都在几个百分点内。
第二档是 JMapper,8300 万 ops 左右,编译期增强带一点额外开销但还能打。
第三档是 datus 和 Orika,3300 万和 1500 万 ops,差距开始拉开。
第四档是 ReMap、ModelMapper、BULL、Dozer,从 200 万掉到 33 万,相比第一档差出两个数量级。Dozer 垫底,33 万 ops/s。
这个分布反映出,是不是走编译期代码生成,几乎是决定性的。反射类框架在 throughput 场景下要付出两个数量级的代价。
5、 怎么复现
克隆仓库后跑:
mvn cleaninstalljava@jvm.options-jartarget/benchmarks.jar只想跑单个框架,加参数指定:
java@jvm.options-jartarget/benchmarks.jar-ptype=MapStruct想要 CSV 结果做二次分析:
java@jvm.options-jartarget/benchmarks.jar-rffresults.csv-rfcsv gnuplot benchmark.plt前置依赖是 Maven 3.x 和 JDK 17 及以上。
6、 这个仓库的价值在哪
它本身没打算给你一个新框架用,目的是给一份可复现的对比数据。选型的时候缺的就是这种横向跑分,单框架 README 里的 benchmark 都挑自己最顺眼的角度写,横向对比少且容易过时。
285 Star 的体量也说明它服务的是细分人群:做 Java 后端架构的人、维护老系统在 Dozer 上挣扎想找替代品的人、好奇 MapStruct 为什么被反复推荐的人。
仓库本身鼓励贡献,加新 mapper 只要继承 AbstractMapperTest 写个单测,再在 MapperBenchmark 里登记一下,PR 过去就行。维护者对社区接入是开放态度。
7、 一点提醒
跑分高不等于适用。MapStruct 这类编译期框架需要声明映射接口,灵活度比不上反射框架,碰到字段动态变化的场景反而麻烦。ModelMapper 当年流行是因为装配成本低,不写接口就能跑,新项目里再用它就要看吞吐要求受不受得了那个数字。
基准测试是工具不是结论,拿来看趋势可以,拿来做选型还要叠项目自身的约束进来。
为装配成本低,不写接口就能跑,新项目里再用它就要看吞吐要求受不受得了那个数字。
基准测试是工具不是结论,拿来看趋势可以,拿来做选型还要叠项目自身的约束进来。