JMH benchmark of Java object-to-object mapping frameworks
Multi-layered applications often require to map between different object models (e.g. DTOs and entities).
Writing such boiler plate mapping code is a tedious and error-prone task.
A lot of object-to-object mapping Java frameworks aims to simplify this work and automate it.
Some uses code instrospection (eg. Dozer). Other uses code generation (ex: MapStruct).
This micro-benchmark compares performance of 9 frameworks. Results could be compared to the benchmark of a code written manually.
Benchmark are powered by a tool called JMH or also known as “Java Microbenchmarking Harness”.
JMH is developed by the OpenJDK team.
Github is for social coding platform: if you want to add another mapping framework or optimize an existing one, we encourage contributions
through pull requests from forks of this repository.
If you want to contribute code this way, please reference a GitHub ticket as well covering the specific issue you are addressing.
To add a new mapper, please add a unit test that extends the AbstractMapperTest
class and declare your mapper into the MapperBenchmark
class.
The data model used by this benchmark is very basic. It comes from the Comparison class from the ModelMapper framework.
It includes combinations which usually appear in Java Beans, such as:
Pre-requisites: Maven 3.x and a JDK 8 (or above)
git clone git://github.com/arey/java-object-mapper-benchmark.git
mvn clean install
java -jar target/benchmarks.jar
Optional: To run a single benchmark, such as MapStruct, use java -jar target/benchmarks.jar -p type=MapStruct
The benchmarks measure throughput, given in “ops/time”. The time unit used is seconds.
Generally, the score represents the number of graph object mapped per second; the higher the score, the better.
Tests has been performed on:
Benchmark | Mode | Samples | Score | Margin error (+/-) | Units |
---|---|---|---|---|---|
Manual | thrpt | 200 | 26 978 437 | 615 002 | ops/s |
MapStruct | thrpt | 200 | 28 039 597 | 199 255 | ops/s |
Selma | thrpt | 200 | 27 518 789 | 238 602 | ops/s |
JMapper | thrpt | 200 | 24 531 754 | 123 945 | ops/s |
Orika | thrpt | 200 | 4 565 378 | 24 947 | ops/s |
ModelMapper | thrpt | 200 | 184 304 | 12 777 | ops/s |
Dozer | thrpt | 200 | 89 860 | 462 | ops/s |
BULL | thrpt | 200 | 178 027 | 679 | ops/s |
datus | thrpt | 200 | 8 230 775 | 59 673 | ops/s |
java -jar target/benchmarks.jar -rff results.csv -rf csv
gnuplot benchmark.plt
. This will output results.png
.