From d2056a1821970e3c780d183fbb636adaba661de1 Mon Sep 17 00:00:00 2001 From: Antoine Rey Date: Sun, 8 Sep 2019 18:00:02 +0200 Subject: [PATCH] Update all mappers to their most recent version and update the readme #19 --- pom.xml | 8 ++-- readme.md | 41 +++++------------- results.csv | 19 ++++---- results.png | Bin 10111 -> 10550 bytes .../javaetmoi/benchmark/MapperBenchmark.java | 2 +- .../mapping/mapper/dozer/DozerMapper.java | 12 +++-- 6 files changed, 36 insertions(+), 46 deletions(-) diff --git a/pom.xml b/pom.xml index 2a370f3..71292ed 100644 --- a/pom.xml +++ b/pom.xml @@ -14,10 +14,10 @@ - 1.5.2 - 6.1.0 - 1.1.0 - 1.2.0.Final + 1.5.4 + 6.5.0 + 2.3.5 + 1.3.0.Final 1.0 1.6.1.CR2 1.19 diff --git a/readme.md b/readme.md index fa1ab92..6ec71d8 100644 --- a/readme.md +++ b/readme.md @@ -65,35 +65,18 @@ Tests has been performed on: * RAM: 16 GB 1867 MHz DDR3 * JVM: Oracle 1.8.0_74-b02 64 bits - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
BenchmarkModeSamplesScoreMargin error (+/-)Units
Manualthrpt20027 598 750346 265ops/s
MapStructthrpt20027 206 021133 009ops/s
Selmathrpt20026 205 612185 326ops/s
JMapperthrpt20023 377 962124 537ops/s
Orikathrpt2004 097 03021 220ops/s
BULLthrpt200468 1294955ops/s
ModelMaperthrpt200323 7913 172ops/s
Dozerthrpt20084 113331ops/s
+| 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 | 121 967 | 973 | ops/s | +| datus | thrpt | 200 | 8 230 775 | 59 673 | ops/s | + ![Framework Comparison](results.png) diff --git a/results.csv b/results.csv index e16dba1..25e7969 100644 --- a/results.csv +++ b/results.csv @@ -1,9 +1,12 @@ "Benchmark","Mode","Threads","Samples","Score","Score Error (99,9%)","Unit","Param: type" -"com.javaetmoi.benchmark.MapperBenchmark.mapper","thrpt",1,200,"27598750,161992","346265,704225","ops/s",Manual -"com.javaetmoi.benchmark.MapperBenchmark.mapper","thrpt",1,200,"27206021,062526","133009,298251","ops/s",MapStruct -"com.javaetmoi.benchmark.MapperBenchmark.mapper","thrpt",1,200,"26205612,876587","185326,677688","ops/s",Selma -"com.javaetmoi.benchmark.MapperBenchmark.mapper","thrpt",1,200,"23377962,917915","124537,993554","ops/s",JMapper -"com.javaetmoi.benchmark.MapperBenchmark.mapper","thrpt",1,200,"4097030,344104","21220,567480","ops/s",Orika -"com.javaetmoi.benchmark.MapperBenchmark.mapper","thrpt",1,200,"468129.769383","4955.739447","ops/s",BULL -"com.javaetmoi.benchmark.MapperBenchmark.mapper","thrpt",1,200,"323791,972104","3172,754252","ops/s",ModelMapper -"com.javaetmoi.benchmark.MapperBenchmark.mapper","thrpt",1,200,"84113,220613","331,664883","ops/s",Dozer +"com.javaetmoi.benchmark.MapperBenchmark.mapper","thrpt",1,200,"26978437,866517","615002,224893","ops/s",Manual +"com.javaetmoi.benchmark.MapperBenchmark.mapper","thrpt",1,200,"28039597,815878","199255,230955","ops/s",MapStruct +"com.javaetmoi.benchmark.MapperBenchmark.mapper","thrpt",1,200,"27518789,645248","238602,253918","ops/s",Selma +"com.javaetmoi.benchmark.MapperBenchmark.mapper","thrpt",1,200,"24531754,377299","123945,801129","ops/s",JMapper +"com.javaetmoi.benchmark.MapperBenchmark.mapper","thrpt",1,200,"8230775,891415","59673,825530","ops/s",datus +"com.javaetmoi.benchmark.MapperBenchmark.mapper","thrpt",1,200,"4565378,535779","24947,644996","ops/s",Orika +"com.javaetmoi.benchmark.MapperBenchmark.mapper","thrpt",1,200,"184304,271986","1277,567799","ops/s",ModelMapper +"com.javaetmoi.benchmark.MapperBenchmark.mapper","thrpt",1,200,"121967,799622","973,434200","ops/s",BULL +"com.javaetmoi.benchmark.MapperBenchmark.mapper","thrpt",1,200,"89860,325285","462,290433","ops/s",Dozer + + diff --git a/results.png b/results.png index 79e8b2a0e6f3fa87b96d932c62bd00f459524eb3..4edb334bb05bc95203b5b52f2d2dcd68967797f8 100644 GIT binary patch literal 10550 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 literal 10111 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