From fe71d7b1c444127f671c6fb97ddd4e5a040fe3e4 Mon Sep 17 00:00:00 2001 From: hannyu Date: Tue, 9 Jun 2026 10:26:37 +0800 Subject: [PATCH 1/3] add SJF4J --- dependency-reduced-pom.xml | 156 ++++++++++++++++++ pom.xml | 12 ++ .../javaetmoi/benchmark/MapperBenchmark.java | 6 +- .../mapping/mapper/sjf4j/Sjf4jMapper.java | 17 ++ .../mapper/sjf4j/Sjf4jOrderMapper.java | 26 +++ 5 files changed, 216 insertions(+), 1 deletion(-) create mode 100644 dependency-reduced-pom.xml create mode 100644 src/main/java/com/javaetmoi/benchmark/mapping/mapper/sjf4j/Sjf4jMapper.java create mode 100644 src/main/java/com/javaetmoi/benchmark/mapping/mapper/sjf4j/Sjf4jOrderMapper.java diff --git a/dependency-reduced-pom.xml b/dependency-reduced-pom.xml new file mode 100644 index 0000000..4e3df86 --- /dev/null +++ b/dependency-reduced-pom.xml @@ -0,0 +1,156 @@ + + + 4.0.0 + com.javaetmoi.benchmark + java-object-mapper-benchmark + JMH benchmark of Object-to-Object mapping frameworks/ + 1.0.0-SNAPSHOT + + 3.9 + + + + + + maven-clean-plugin + 3.3.2 + + + maven-deploy-plugin + 3.1.1 + + + maven-install-plugin + 3.1.1 + + + maven-jar-plugin + 3.3.0 + + + maven-javadoc-plugin + 3.6.2 + + + maven-resources-plugin + 3.3.1 + + + maven-site-plugin + 3.7.1 + + + maven-source-plugin + 3.3.0 + + + maven-surefire-plugin + 3.2.3 + + --add-opens java.base/java.util=ALL-UNNAMED + --add-opens java.base/java.lang=ALL-UNNAMED + --add-opens java.base/java.lang.reflect=ALL-UNNAMED + --add-opens java.base/java.text=ALL-UNNAMED + --add-opens java.desktop/java.awt.font=ALL-UNNAMED + + + + + + + maven-compiler-plugin + 3.15.0 + + ${java.version} + + + + maven-shade-plugin + 3.5.1 + + + package + + shade + + + ${uberjar.name} + + + org.openjdk.jmh.Main + + + + + *:* + + META-INF/*.SF + META-INF/*.DSA + META-INF/*.RSA + + + + + + + + + + + + org.openjdk.jmh + jmh-generator-annprocess + 1.37 + provided + + + fr.xebia.extras + selma-processor + 1.0 + provided + + + org.junit.jupiter + junit-jupiter-engine + 6.1.0 + test + + + junit-platform-engine + org.junit.platform + + + junit-jupiter-api + org.junit.jupiter + + + apiguardian-api + org.apiguardian + + + jspecify + org.jspecify + + + + + + 7.0.0 + 3.0.4 + 3.2.6 + 4.3.7 + benchmarks + UTF-8 + 1.6.0 + 6.1.0 + 17 + 4.0.0 + 1.0 + 1.37 + 1.6.3 + 2.0.9 + 1.6.1.CR2 + 1.3.1 + 1.5.0 + + diff --git a/pom.xml b/pom.xml index a9d3027..9dda8c6 100644 --- a/pom.xml +++ b/pom.xml @@ -24,6 +24,7 @@ 3.0.4 1.5.0 4.3.7 + 1.3.1 6.1.0 2.0.9 4.0.0 @@ -117,6 +118,17 @@ ${version.remap} + + org.sjf4j + sjf4j + ${version.sjf4j} + + + org.sjf4j + sjf4j-processor + ${version.sjf4j} + + org.junit.jupiter junit-jupiter-engine diff --git a/src/main/java/com/javaetmoi/benchmark/MapperBenchmark.java b/src/main/java/com/javaetmoi/benchmark/MapperBenchmark.java index 2242f2b..c4c031c 100644 --- a/src/main/java/com/javaetmoi/benchmark/MapperBenchmark.java +++ b/src/main/java/com/javaetmoi/benchmark/MapperBenchmark.java @@ -11,6 +11,7 @@ import com.javaetmoi.benchmark.mapping.mapper.orika.OrikaMapper; import com.javaetmoi.benchmark.mapping.mapper.remappe.ReMappeMapper; import com.javaetmoi.benchmark.mapping.mapper.selma.SelmaMapper; +import com.javaetmoi.benchmark.mapping.mapper.sjf4j.Sjf4jMapper; import com.javaetmoi.benchmark.mapping.model.dto.OrderDTO; import com.javaetmoi.benchmark.mapping.model.entity.Order; import com.javaetmoi.benchmark.mapping.model.entity.OrderFactory; @@ -27,7 +28,7 @@ @State(Scope.Benchmark) public class MapperBenchmark { - @Param({"Manual", "MapStruct", "Selma", "JMapper", "datus", "Orika", "ModelMapper", "BULL", "Dozer", "ReMap"}) + @Param({"Manual", "MapStruct", "Selma", "JMapper", "datus", "Orika", "ModelMapper", "BULL", "Dozer", "ReMap", "SJF4J"}) private String type; private OrderMapper mapper; @@ -66,6 +67,9 @@ public void setup() { case "ReMap": mapper = new ReMappeMapper(); break; + case "SJF4J": + mapper = new Sjf4jMapper(); + break; default: throw new IllegalStateException("Unknown type: " + type); } diff --git a/src/main/java/com/javaetmoi/benchmark/mapping/mapper/sjf4j/Sjf4jMapper.java b/src/main/java/com/javaetmoi/benchmark/mapping/mapper/sjf4j/Sjf4jMapper.java new file mode 100644 index 0000000..9395070 --- /dev/null +++ b/src/main/java/com/javaetmoi/benchmark/mapping/mapper/sjf4j/Sjf4jMapper.java @@ -0,0 +1,17 @@ +package com.javaetmoi.benchmark.mapping.mapper.sjf4j; + +import com.javaetmoi.benchmark.mapping.mapper.OrderMapper; +import com.javaetmoi.benchmark.mapping.model.dto.OrderDTO; +import com.javaetmoi.benchmark.mapping.model.entity.Order; +import org.sjf4j.compiled.CompiledNodes; + + +public class Sjf4jMapper implements OrderMapper { + + private final Sjf4jOrderMapper mapper = CompiledNodes.of(Sjf4jOrderMapper.class); + + @Override + public OrderDTO map(Order source) { + return mapper.map(source); + } +} diff --git a/src/main/java/com/javaetmoi/benchmark/mapping/mapper/sjf4j/Sjf4jOrderMapper.java b/src/main/java/com/javaetmoi/benchmark/mapping/mapper/sjf4j/Sjf4jOrderMapper.java new file mode 100644 index 0000000..a4be958 --- /dev/null +++ b/src/main/java/com/javaetmoi/benchmark/mapping/mapper/sjf4j/Sjf4jOrderMapper.java @@ -0,0 +1,26 @@ +package com.javaetmoi.benchmark.mapping.mapper.sjf4j; + +import com.javaetmoi.benchmark.mapping.mapper.OrderMapper; +import com.javaetmoi.benchmark.mapping.model.dto.OrderDTO; +import com.javaetmoi.benchmark.mapping.model.dto.ProductDTO; +import com.javaetmoi.benchmark.mapping.model.entity.Order; +import com.javaetmoi.benchmark.mapping.model.entity.Product; +import org.sjf4j.annotation.mapper.CompiledMapper; +import org.sjf4j.annotation.mapper.Mapping; +import org.sjf4j.annotation.mapper.Mappings; + +@CompiledMapper +public interface Sjf4jOrderMapper extends OrderMapper { + + @Mappings({ + @Mapping(target = "customerName", source = "$.customer.name"), + @Mapping(target = "billingStreetAddress", source = "$.customer.billingAddress.street"), + @Mapping(target = "billingCity", source = "$.customer.billingAddress.city"), + @Mapping(target = "shippingStreetAddress", source = "$.customer.shippingAddress.street"), + @Mapping(target = "shippingCity", source = "$.customer.shippingAddress.city"), + }) + OrderDTO map(Order source); + + ProductDTO productToProductDTO(Product product); + +} \ No newline at end of file From 515f4723c86e8fe38dcad80c87296c4595f39b11 Mon Sep 17 00:00:00 2001 From: hannyu Date: Wed, 10 Jun 2026 08:29:51 +0800 Subject: [PATCH 2/3] add SJF4J to README --- .gitignore | 3 +- dependency-reduced-pom.xml | 156 ------------------------------------- readme.md | 1 + 3 files changed, 3 insertions(+), 157 deletions(-) delete mode 100644 dependency-reduced-pom.xml diff --git a/.gitignore b/.gitignore index ea331b5..cdd86c7 100644 --- a/.gitignore +++ b/.gitignore @@ -3,4 +3,5 @@ target/ .classpath .settings/ .idea/ -*.iml \ No newline at end of file +*.iml +dependency-reduced-pom.xml \ No newline at end of file diff --git a/dependency-reduced-pom.xml b/dependency-reduced-pom.xml deleted file mode 100644 index 4e3df86..0000000 --- a/dependency-reduced-pom.xml +++ /dev/null @@ -1,156 +0,0 @@ - - - 4.0.0 - com.javaetmoi.benchmark - java-object-mapper-benchmark - JMH benchmark of Object-to-Object mapping frameworks/ - 1.0.0-SNAPSHOT - - 3.9 - - - - - - maven-clean-plugin - 3.3.2 - - - maven-deploy-plugin - 3.1.1 - - - maven-install-plugin - 3.1.1 - - - maven-jar-plugin - 3.3.0 - - - maven-javadoc-plugin - 3.6.2 - - - maven-resources-plugin - 3.3.1 - - - maven-site-plugin - 3.7.1 - - - maven-source-plugin - 3.3.0 - - - maven-surefire-plugin - 3.2.3 - - --add-opens java.base/java.util=ALL-UNNAMED - --add-opens java.base/java.lang=ALL-UNNAMED - --add-opens java.base/java.lang.reflect=ALL-UNNAMED - --add-opens java.base/java.text=ALL-UNNAMED - --add-opens java.desktop/java.awt.font=ALL-UNNAMED - - - - - - - maven-compiler-plugin - 3.15.0 - - ${java.version} - - - - maven-shade-plugin - 3.5.1 - - - package - - shade - - - ${uberjar.name} - - - org.openjdk.jmh.Main - - - - - *:* - - META-INF/*.SF - META-INF/*.DSA - META-INF/*.RSA - - - - - - - - - - - - org.openjdk.jmh - jmh-generator-annprocess - 1.37 - provided - - - fr.xebia.extras - selma-processor - 1.0 - provided - - - org.junit.jupiter - junit-jupiter-engine - 6.1.0 - test - - - junit-platform-engine - org.junit.platform - - - junit-jupiter-api - org.junit.jupiter - - - apiguardian-api - org.apiguardian - - - jspecify - org.jspecify - - - - - - 7.0.0 - 3.0.4 - 3.2.6 - 4.3.7 - benchmarks - UTF-8 - 1.6.0 - 6.1.0 - 17 - 4.0.0 - 1.0 - 1.37 - 1.6.3 - 2.0.9 - 1.6.1.CR2 - 1.3.1 - 1.5.0 - - diff --git a/readme.md b/readme.md index 3d73602..1ac65c2 100644 --- a/readme.md +++ b/readme.md @@ -21,6 +21,7 @@ JMH is developed by the OpenJDK team. - [BULL](https://github.com/HotelsDotCom/bull) - [datus](https://github.com/roookeee/datus) - [ReMap](https://github.com/remondis-it/remap) +- [SJF4J](https://sjf4j.org/) ## Contributing to benchmark From cbac2790d6f74c5a9c0922c4296b8f7cd71162be Mon Sep 17 00:00:00 2001 From: hannyu Date: Wed, 10 Jun 2026 16:19:53 +0800 Subject: [PATCH 3/3] Add SJF4J in main.yaml --- .github/workflows/main.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index d29b53c..5000abb 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -34,7 +34,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - mapper: [Manual, MapStruct, Selma, JMapper, datus, Orika, ModelMapper, BULL, Dozer, ReMap] + mapper: [Manual, MapStruct, Selma, JMapper, datus, Orika, ModelMapper, BULL, Dozer, ReMap, SJF4J] steps: - uses: actions/checkout@v4.1.1 - name: Set up JDK ${{ env.JAVA_VERSION }} @@ -69,7 +69,7 @@ jobs: name: Prepare CSV Results run: | head -1 results_Manual.csv > results.csv - for mapper in Manual MapStruct Selma JMapper datus Orika ModelMapper BULL Dozer ReMap; do sed 1d results_${mapper}.csv >> results.csv; done + for mapper in Manual MapStruct Selma JMapper datus Orika ModelMapper BULL Dozer ReMap SJF4J; do sed 1d results_${mapper}.csv >> results.csv; done less results.csv - uses: actions/upload-artifact@v4 name: Upload CSV Results