DTO、VO、POJO转换性能测试

一、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
mapstruct10
modelMapper112
mapstruct1000
modelMapper10013
mapstruct5000
modelMapper50013
mapstruct15001
modelMapper150018
mapstruct50001
modelMapper500061
mapstruct100001
modelMapper1000049
mapstruct500008
modelMapper50000361
mapstruct10000010
modelMapper100000322

四、结论

mapstruct在运行性能和内存占用上甩了modelMapper几十条街,

同样modelMapper在开发效率上也远远甩开mapstruct

两者就像班上两个非常极端偏科的科代表, 中小型项目用modelMapper利大于弊;大多数接口返回数据多的不过几百条增加个十几毫秒响应时间完全可以接受,偶尔有特殊接口可以结合使用mapstruct。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ZuuuuYao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值