PO、DTO、VO、BO对象转换性能测试
一、Java对象转换性能测试
(一)测试对象 mapstruct
Mapstruct 是一个 Java 注解处理器,主要用于简化 Java 对象之间的映射操作。它通过在编译时生成映射代码,避免了运行时的反射等性能开销较大的操作。最终转换是调用对象的get、set方法性能上比较好,但是用起来比较麻烦需要手动写大量映射关系。
(二)测试对象 modelmapper
ModelMapper 在进行对象映射时,首先会对源对象和目标对象的类型进行分析。它通过 Java 的反射机制来获取源对象和目标对象的类结构信息,包括属性名称、类型、访问修饰符等。开发效率极高,无论是简单的 POJO(Plain Old Java Object)之间的转换,还是涉及复杂嵌套结构和类型转换的情况。
二 测试代码
(1) 准备 UserEntity
package org.github.zuuu.yao.demo.map;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class UserEntity {
private String id;
private String name;
private String phone;
private String age;
private String status;
}
(2) 准备 UserVO
package org.github.zuuu.yao.demo.map;
import lombok.Data;
@Data
public class UserVO {
private String id;
private String name;
private String realName;
private String phone;
private String age;
private Integer status;
}
(3) 编写 mapstruct 的映射器 UserStructMapper
package org.github.zuuu.yao.demo.map;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.Mappings;
import org.mapstruct.factory.Mappers;
import java.util.List;
@Mapper
public interface UserStructMapper {
/**
* 获取该类自动生成的实现类的实例
*/
UserStructMapper INSTANCES = Mappers.getMapper(UserStructMapper.class);
/**
* 将实体类转换为VO
* @param userEntity
* @return
*/
@Mappings({
@Mapping(source = "id", target = "id"),
@Mapping(source = "name", target = "name"),
@Mapping(source = "name", target = "realName"),
@Mapping(source = "phone", target = "phone"),
@Mapping(source = "age", target = "age"),
@Mapping(source = "status", target = "status"),
})
UserVO toUserVO(UserEntity userEntity);
@Mappings({
@Mapping(source = "id", target = "id"),
@Mapping(source = "name", target = "name"),
@Mapping(source = "name", target = "realName"),
@Mapping(source = "phone", target = "phone"),
@Mapping(source = "age", target = "age"),
@Mapping(source = "status", target = "status"),
})
List<UserVO> toUserVOList(List<UserEntity> userEntityList);
}
(4) 准备测试类
package org.github.zuuu.yao.demo.map;
import org.modelmapper.ModelMapper;
import java.lang.instrument.Instrumentation;
import java.util.List;
import java.util.Random;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
public class Main {
/**
* MapStruct转换对象
*/
private static final UserStructMapper MAPPER = UserStructMapper.INSTANCES;
/**
* ModelMapper转换对象
*/
private static final ModelMapper MODEL_MAPPER = new ModelMapper();
/**
* 随机数生成器
*/
private static final Random RANDOM = new Random();
private static Instrumentation instrumentation;
public static void main(String[] args) {
// 测试前先调用一次modelMapper的转换触发懒加载机制,避免第一次转换耗时
MODEL_MAPPER.map(new Object(),UserVO.class);
testConversionTime(1);
testConversionTime(100);
testConversionTime(500);
testConversionTime(1500);
testConversionTime(5000);
testConversionTime(10000);
testConversionTime(50000);
testConversionTime(100000);
}
/**
* 测试MapStruct和ModelMapper的批量转换性能
*
* @param count 生成的用户实体数量
*/
private static void testConversionTime(int count) {
// 生成指定数量的UserEntity列表
List<UserEntity> entities = IntStream.range(0, count)
.mapToObj(i -> UserEntity.builder()
.id("1000" + RANDOM.nextInt())
.phone("19999999" + RANDOM.nextInt())
.age("18" + RANDOM.nextInt())
.name("zuuuYao" + RANDOM.nextInt())
.build())
.collect(Collectors.toList());
System.out.println("----------------------------------------------------------------------------------------");
System.out.println("数据量" + count + "时:");
long startTime = System.currentTimeMillis();
List<UserVO> mapstructList = MAPPER.toUserVOList(entities);
long endTime = System.currentTimeMillis();
System.out.println("mapstruct耗时:" + (endTime - startTime) + "ms");
startTime = System.currentTimeMillis();
List<UserVO> modelMapperList = entities.stream()
.map(entity -> MODEL_MAPPER.map(entity, UserVO.class))
.collect(Collectors.toList());
endTime = System.currentTimeMillis();
System.out.println("modelMapper耗时:" + (endTime - startTime) + "ms \n");
}
}
(5) 输出结果
"C:\Program Files\Java\jdk1.8.0_331\bin\java.exe" -agentlib:jdwp=transport=dt_socket,address=127.0.0.1:51434,suspend=y,server=n -javaagent:C:\Users\zuuuYao\AppData\Local\JetBrains\IntelliJIdea2024.2\captureAgent\debugger-agent.jar -Dkotlinx.coroutines.debug.enable.creation.stack.trace=false -Ddebugger.agent.enable.coroutines=true -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_331\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_331\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_331\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_331\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_331\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_331\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_331\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_331\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_331\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_331\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_331\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_331\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_331\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_331\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_331\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_331\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_331\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_331\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_331\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_331\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_331\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_331\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_331\jre\lib\rt.jar;D:\Develop\demo\target\test-classes;D:\Develop\demo\target\classes;C:\Users\zuuuYao\.m2\repository\com\alibaba\cloud\spring-cloud-starter-alibaba-nacos-config\2.2.10-RC1\spring-cloud-starter-alibaba-nacos-config-2.2.10-RC1.jar;C:\Users\zuuuYao\.m2\repository\com\alibaba\spring\spring-context-support\1.0.11\spring-context-support-1.0.11.jar;C:\Users\zuuuYao\.m2\repository\com\alibaba\nacos\nacos-client\2.2.0\nacos-client-2.2.0.jar;C:\Users\zuuuYao\.m2\repository\com\alibaba\nacos\nacos-auth-plugin\2.2.0\nacos-auth-plugin-2.2.0.jar;C:\Users\zuuuYao\.m2\repository\com\alibaba\nacos\nacos-encryption-plugin\2.2.0\nacos-encryption-plugin-2.2.0.jar;C:\Users\zuuuYao\.m2\repository\com\fasterxml\jackson\core\jackson-core\2.10.4\jackson-core-2.10.4.jar;C:\Users\zuuuYao\.m2\repository\com\fasterxml\jackson\core\jackson-databind\2.10.4\jackson-databind-2.10.4.jar;C:\Users\zuuuYao\.m2\repository\com\fasterxml\jackson\core\jackson-annotations\2.10.4\jackson-annotations-2.10.4.jar;C:\Users\zuuuYao\.m2\repository\org\apache\httpcomponents\httpasyncclient\4.1.4\httpasyncclient-4.1.4.jar;C:\Users\zuuuYao\.m2\repository\org\apache\httpcomponents\httpcore\4.4.13\httpcore-4.4.13.jar;C:\Users\zuuuYao\.m2\repository\org\apache\httpcomponents\httpcore-nio\4.4.13\httpcore-nio-4.4.13.jar;C:\Users\zuuuYao\.m2\repository\org\apache\httpcomponents\httpclient\4.5.12\httpclient-4.5.12.jar;C:\Users\zuuuYao\.m2\repository\io\prometheus\simpleclient\0.12.0\simpleclient-0.12.0.jar;C:\Users\zuuuYao\.m2\repository\io\prometheus\simpleclient_tracer_otel\0.12.0\simpleclient_tracer_otel-0.12.0.jar;C:\Users\zuuuYao\.m2\repository\io\prometheus\simpleclient_tracer_common\0.12.0\simpleclient_tracer_common-0.12.0.jar;C:\Users\zuuuYao\.m2\repository\io\prometheus\simpleclient_tracer_otel_agent\0.12.0\simpleclient_tracer_otel_agent-0.12.0.jar;C:\Users\zuuuYao\.m2\repository\org\yaml\snakeyaml\1.25\snakeyaml-1.25.jar;C:\Users\zuuuYao\.m2\repository\org\springframework\cloud\spring-cloud-commons\2.2.9.RELEASE\spring-cloud-commons-2.2.9.RELEASE.jar;C:\Users\zuuuYao\.m2\repository\org\springframework\security\spring-security-crypto\5.2.4.RELEASE\spring-security-crypto-5.2.4.RELEASE.jar;C:\Users\zuuuYao\.m2\repository\org\springframework\cloud\spring-cloud-context\2.2.9.RELEASE\spring-cloud-context-2.2.9.RELEASE.jar;C:\Users\zuuuYao\.m2\repository\com\alibaba\cloud\spring-cloud-starter-alibaba-nacos-discovery\2.2.10-RC1\spring-cloud-starter-alibaba-nacos-discovery-2.2.10-RC1.jar;C:\Users\zuuuYao\.m2\repository\com\alibaba\cloud\spring-cloud-alibaba-commons\2.2.10-RC1\spring-cloud-alibaba-commons-2.2.10-RC1.jar;C:\Users\zuuuYao\.m2\repository\org\springframework\cloud\spring-cloud-starter-netflix-ribbon\2.2.9.RELEASE\spring-cloud-starter-netflix-ribbon-2.2.9.RELEASE.jar;C:\Users\zuuuYao\.m2\repository\org\springframework\cloud\spring-cloud-starter\2.2.9.RELEASE\spring-cloud-starter-2.2.9.RELEASE.jar;C:\Users\zuuuYao\.m2\repository\org\springframework\security\spring-security-rsa\1.0.9.RELEASE\spring-security-rsa-1.0.9.RELEASE.jar;C:\Users\zuuuYao\.m2\repository\org\bouncycastle\bcpkix-jdk15on\1.64\bcpkix-jdk15on-1.64.jar;C:\Users\zuuuYao\.m2\repository\org\bouncycastle\bcprov-jdk15on\1.64\bcprov-jdk15on-1.64.jar;C:\Users\zuuuYao\.m2\repository\org\springframework\cloud\spring-cloud-netflix-ribbon\2.2.9.RELEASE\spring-cloud-netflix-ribbon-2.2.9.RELEASE.jar;C:\Users\zuuuYao\.m2\repository\org\springframework\cloud\spring-cloud-netflix-archaius\2.2.9.RELEASE\spring-cloud-netflix-archaius-2.2.9.RELEASE.jar;C:\Users\zuuuYao\.m2\repository\org\springframework\cloud\spring-cloud-starter-netflix-archaius\2.2.9.RELEASE\spring-cloud-starter-netflix-archaius-2.2.9.RELEASE.jar;C:\Users\zuuuYao\.m2\repository\com\netflix\archaius\archaius-core\0.7.7\archaius-core-0.7.7.jar;C:\Users\zuuuYao\.m2\repository\com\google\code\findbugs\jsr305\3.0.1\jsr305-3.0.1.jar;C:\Users\zuuuYao\.m2\repository\commons-configuration\commons-configuration\1.8\commons-configuration-1.8.jar;C:\Users\zuuuYao\.m2\repository\com\netflix\ribbon\ribbon\2.3.0\ribbon-2.3.0.jar;C:\Users\zuuuYao\.m2\repository\com\netflix\ribbon\ribbon-transport\2.3.0\ribbon-transport-2.3.0.jar;C:\Users\zuuuYao\.m2\repository\io\reactivex\rxnetty-contexts\0.4.9\rxnetty-contexts-0.4.9.jar;C:\Users\zuuuYao\.m2\repository\io\reactivex\rxnetty-servo\0.4.9\rxnetty-servo-0.4.9.jar;C:\Users\zuuuYao\.m2\repository\com\netflix\hystrix\hystrix-core\1.4.3\hystrix-core-1.4.3.jar;C:\Users\zuuuYao\.m2\repository\javax\inject\javax.inject\1\javax.inject-1.jar;C:\Users\zuuuYao\.m2\repository\io\reactivex\rxnetty\0.4.9\rxnetty-0.4.9.jar;C:\Users\zuuuYao\.m2\repository\com\google\guava\guava\16.0.1\guava-16.0.1.jar;C:\Users\zuuuYao\.m2\repository\com\netflix\ribbon\ribbon-core\2.3.0\ribbon-core-2.3.0.jar;C:\Users\zuuuYao\.m2\repository\org\slf4j\slf4j-api\1.7.30\slf4j-api-1.7.30.jar;C:\Users\zuuuYao\.m2\repository\commons-lang\commons-lang\2.6\commons-lang-2.6.jar;C:\Users\zuuuYao\.m2\repository\com\netflix\ribbon\ribbon-httpclient\2.3.0\ribbon-httpclient-2.3.0.jar;C:\Users\zuuuYao\.m2\repository\commons-collections\commons-collections\3.2.2\commons-collections-3.2.2.jar;C:\Users\zuuuYao\.m2\repository\com\sun\jersey\jersey-client\1.19.1\jersey-client-1.19.1.jar;C:\Users\zuuuYao\.m2\repository\com\sun\jersey\jersey-core\1.19.1\jersey-core-1.19.1.jar;C:\Users\zuuuYao\.m2\repository\javax\ws\rs\jsr311-api\1.1.1\jsr311-api-1.1.1.jar;C:\Users\zuuuYao\.m2\repository\com\sun\jersey\contribs\jersey-apache-client4\1.19.1\jersey-apache-client4-1.19.1.jar;C:\Users\zuuuYao\.m2\repository\com\netflix\servo\servo-core\0.10.1\servo-core-0.10.1.jar;C:\Users\zuuuYao\.m2\repository\com\netflix\servo\servo-internal\0.10.1\servo-internal-0.10.1.jar;C:\Users\zuuuYao\.m2\repository\com\netflix\netflix-commons\netflix-commons-util\0.1.1\netflix-commons-util-0.1.1.jar;C:\Users\zuuuYao\.m2\repository\com\netflix\ribbon\ribbon-loadbalancer\2.3.0\ribbon-loadbalancer-2.3.0.jar;C:\Users\zuuuYao\.m2\repository\com\netflix\netflix-commons\netflix-statistics\0.1.1\netflix-statistics-0.1.1.jar;C:\Users\zuuuYao\.m2\repository\io\reactivex\rxjava\1.3.8\rxjava-1.3.8.jar;C:\Users\zuuuYao\.m2\repository\commons-codec\commons-codec\1.11\commons-codec-1.11.jar;C:\Users\zuuuYao\.m2\repository\org\springframework\boot\spring-boot-starter-web\2.2.7.RELEASE\spring-boot-starter-web-2.2.7.RELEASE.jar;C:\Users\zuuuYao\.m2\repository\org\springframework\boot\spring-boot-starter\2.2.7.RELEASE\spring-boot-starter-2.2.7.RELEASE.jar;C:\Users\zuuuYao\.m2\repository\org\springframework\boot\spring-boot\2.2.7.RELEASE\spring-boot-2.2.7.RELEASE.jar;C:\Users\zuuuYao\.m2\repository\org\springframework\boot\spring-boot-autoconfigure\2.2.7.RELEASE\spring-boot-autoconfigure-2.2.7.RELEASE.jar;C:\Users\zuuuYao\.m2\repository\org\springframework\boot\spring-boot-starter-logging\2.2.7.RELEASE\spring-boot-starter-logging-2.2.7.RELEASE.jar;C:\Users\zuuuYao\.m2\repository\ch\qos\logback\logback-classic\1.2.3\logback-classic-1.2.3.jar;C:\Users\zuuuYao\.m2\repository\ch\qos\logback\logback-core\1.2.3\logback-core-1.2.3.jar;C:\Users\zuuuYao\.m2\repository\org\apache\logging\log4j\log4j-to-slf4j\2.12.1\log4j-to-slf4j-2.12.1.jar;C:\Users\zuuuYao\.m2\repository\org\apache\logging\log4j\log4j-api\2.12.1\log4j-api-2.12.1.jar;C:\Users\zuuuYao\.m2\repository\org\slf4j\jul-to-slf4j\1.7.30\jul-to-slf4j-1.7.30.jar;C:\Users\zuuuYao\.m2\repository\jakarta\annotation\jakarta.annotation-api\1.3.5\jakarta.annotation-api-1.3.5.jar;C:\Users\zuuuYao\.m2\repository\org\springframework\spring-core\5.2.6.RELEASE\spring-core-5.2.6.RELEASE.jar;C:\Users\zuuuYao\.m2\repository\org\springframework\spring-jcl\5.2.6.RELEASE\spring-jcl-5.2.6.RELEASE.jar;C:\Users\zuuuYao\.m2\repository\org\springframework\boot\spring-boot-starter-json\2.2.7.RELEASE\spring-boot-starter-json-2.2.7.RELEASE.jar;C:\Users\zuuuYao\.m2\repository\com\fasterxml\jackson\datatype\jackson-datatype-jdk8\2.10.4\jackson-datatype-jdk8-2.10.4.jar;C:\Users\zuuuYao\.m2\repository\com\fasterxml\jackson\datatype\jackson-datatype-jsr310\2.10.4\jackson-datatype-jsr310-2.10.4.jar;C:\Users\zuuuYao\.m2\repository\com\fasterxml\jackson\module\jackson-module-parameter-names\2.10.4\jackson-module-parameter-names-2.10.4.jar;C:\Users\zuuuYao\.m2\repository\org\springframework\boot\spring-boot-starter-tomcat\2.2.7.RELEASE\spring-boot-starter-tomcat-2.2.7.RELEASE.jar;C:\Users\zuuuYao\.m2\repository\org\apache\tomcat\embed\tomcat-embed-core\9.0.34\tomcat-embed-core-9.0.34.jar;C:\Users\zuuuYao\.m2\repository\org\apache\tomcat\embed\tomcat-embed-el\9.0.34\tomcat-embed-el-9.0.34.jar;C:\Users\zuuuYao\.m2\repository\org\apache\tomcat\embed\tomcat-embed-websocket\9.0.34\tomcat-embed-websocket-9.0.34.jar;C:\Users\zuuuYao\.m2\repository\org\springframework\boot\spring-boot-starter-validation\2.2.7.RELEASE\spring-boot-starter-validation-2.2.7.RELEASE.jar;C:\Users\zuuuYao\.m2\repository\jakarta\validation\jakarta.validation-api\2.0.2\jakarta.validation-api-2.0.2.jar;C:\Users\zuuuYao\.m2\repository\org\hibernate\validator\hibernate-validator\6.0.19.Final\hibernate-validator-6.0.19.Final.jar;C:\Users\zuuuYao\.m2\repository\org\jboss\logging\jboss-logging\3.4.1.Final\jboss-logging-3.4.1.Final.jar;C:\Users\zuuuYao\.m2\repository\com\fasterxml\classmate\1.5.1\classmate-1.5.1.jar;C:\Users\zuuuYao\.m2\repository\org\springframework\spring-web\5.2.6.RELEASE\spring-web-5.2.6.RELEASE.jar;C:\Users\zuuuYao\.m2\repository\org\springframework\spring-beans\5.2.6.RELEASE\spring-beans-5.2.6.RELEASE.jar;C:\Users\zuuuYao\.m2\repository\org\springframework\spring-webmvc\5.2.6.RELEASE\spring-webmvc-5.2.6.RELEASE.jar;C:\Users\zuuuYao\.m2\repository\org\springframework\spring-aop\5.2.6.RELEASE\spring-aop-5.2.6.RELEASE.jar;C:\Users\zuuuYao\.m2\repository\org\springframework\spring-context\5.2.6.RELEASE\spring-context-5.2.6.RELEASE.jar;C:\Users\zuuuYao\.m2\repository\org\springframework\spring-expression\5.2.6.RELEASE\spring-expression-5.2.6.RELEASE.jar;C:\Users\zuuuYao\.m2\repository\com\alibaba\fastjson\2.0.22\fastjson-2.0.22.jar;C:\Users\zuuuYao\.m2\repository\com\alibaba\fastjson2\fastjson2-extension\2.0.22\fastjson2-extension-2.0.22.jar;C:\Users\zuuuYao\.m2\repository\com\alibaba\fastjson2\fastjson2\2.0.22\fastjson2-2.0.22.jar;C:\Users\zuuuYao\.m2\repository\com\squareup\okhttp3\okhttp\3.14.8\okhttp-3.14.8.jar;C:\Users\zuuuYao\.m2\repository\com\squareup\okio\okio\1.17.2\okio-1.17.2.jar;C:\Users\zuuuYao\.m2\repository\org\mapstruct\mapstruct\1.6.2\mapstruct-1.6.2.jar;C:\Users\zuuuYao\.m2\repository\org\mapstruct\mapstruct-processor\1.6.2\mapstruct-processor-1.6.2.jar;C:\Users\zuuuYao\.m2\repository\org\modelmapper\modelmapper\3.2.1\modelmapper-3.2.1.jar;C:\Users\zuuuYao\.m2\repository\org\projectlombok\lombok\1.18.12\lombok-1.18.12.jar;C:\Program Files\JetBrains\IntelliJ IDEA 2024.2.0.1\lib\idea_rt.jar" org.github.zuuu.yao.demo.map.Main
Connected to the target VM, address: '127.0.0.1:51434', transport: 'socket'
----------------------------------------------------------------------------------------
数据量1时:
mapstruct耗时:0ms
modelMapper耗时:12ms
----------------------------------------------------------------------------------------
数据量100时:
mapstruct耗时:0ms
modelMapper耗时:13ms
----------------------------------------------------------------------------------------
数据量500时:
mapstruct耗时:0ms
modelMapper耗时:13ms
----------------------------------------------------------------------------------------
数据量1500时:
mapstruct耗时:1ms
modelMapper耗时:18ms
----------------------------------------------------------------------------------------
数据量5000时:
mapstruct耗时:1ms
modelMapper耗时:61ms
----------------------------------------------------------------------------------------
数据量10000时:
mapstruct耗时:1ms
modelMapper耗时:49ms
----------------------------------------------------------------------------------------
数据量50000时:
mapstruct耗时:8ms
modelMapper耗时:361ms
----------------------------------------------------------------------------------------
数据量100000时:
mapstruct耗时:10ms
modelMapper耗时:322ms
Disconnected from the target VM, address: '127.0.0.1:51434', transport: 'socket'
Process finished with exit code 0
三、测试报告
库 | 数据量 | 耗时 ms |
---|---|---|
mapstruct | 1 | 0 |
modelMapper | 1 | 12 |
– | – | – |
mapstruct | 100 | 0 |
modelMapper | 100 | 13 |
– | – | – |
mapstruct | 500 | 0 |
modelMapper | 500 | 13 |
– | – | – |
mapstruct | 1500 | 1 |
modelMapper | 1500 | 18 |
– | – | – |
mapstruct | 5000 | 1 |
modelMapper | 5000 | 61 |
– | – | – |
mapstruct | 10000 | 1 |
modelMapper | 10000 | 49 |
– | – | – |
mapstruct | 50000 | 8 |
modelMapper | 50000 | 361 |
– | – | – |
mapstruct | 100000 | 10 |
modelMapper | 100000 | 322 |
四、结论
mapstruct
在运行性能和内存占用上甩了modelMapper
几十条街,
同样modelMapper
在开发效率上也远远甩开mapstruct
。
两者就像班上两个非常极端偏科的科代表, 中小型项目用modelMapper利大于弊;大多数接口返回数据多的不过几百条增加个十几毫秒响应时间完全可以接受,偶尔有特殊接口可以结合使用mapstruct。