美文网首页
JMH基准测试

JMH基准测试

作者: CoderLJW | 来源:发表于2024-02-17 14:21 被阅读0次

实例类

@Data
@AllArgsConstructor
@NoArgsConstructor
public class UserEntity {
    private Long id;
    private String email;
    private BigDecimal price;
}

单例

@Getter
public enum ObjectMapperInstance {

    INSTANCE;

    private final ObjectMapper objectMapper = new ObjectMapper();

    ObjectMapperInstance() {}
}

添加依赖

        <dependency>
            <groupId>org.openjdk.jmh</groupId>
            <artifactId>jmh-core</artifactId>
            <version>1.21</version>
        </dependency>
        <dependency>
            <groupId>org.openjdk.jmh</groupId>
            <artifactId>jmh-generator-annprocess</artifactId>
            <version>1.21</version>
<!--            <scope>test</scope>-->
        </dependency>

JsonJMHTest

// 用于指定当前 Benchmark 方法使用哪种模式测试。JMH 提供了4种不同的模式,用于输出不同的结果指标
// Throughput | 吞吐量,ops/time。单位时间内执行操作的平均次数 // AverageTime | 每次操作所需时间,time/op。执行每次操作所需的平均时间 
// SampleTime | 同 AverageTime。区别在于 SampleTime 会统计取样 x% 达到了多少 time/op
@BenchmarkMode(Mode.Throughput)
@OutputTimeUnit(TimeUnit.SECONDS)
@State(Scope.Thread)
@Fork(1)
// 预热迭代,iterations 用于指定迭代次数,time 和 timeUnit 用于每个迭代的时间,batchSize 表示执行多少次 Benchmark 方法为一个 invocation
@Warmup(iterations = 5, time = 1)
// 测试迭代
@Measurement(iterations = 3, time = 1)
public class JsonJMHTest {

    String json = "{\"id\":963852741,\"email\":\"ljw789456123@gmail.com\",\"price\":12963852.25}";
    UserEntity userEntity = new UserEntity(963852741L,"ljw789456123@gmail.com", BigDecimal.valueOf(12963852.25));
    /**
     * 测试String to Object
     * Benchmark 用于告诉 JMH 哪些方法需要进行测试,只能注解在方法上 
     */
    @Benchmark
    public UserEntity objectMapper2ObjTest() throws JsonProcessingException {
        ObjectMapper objectMapper = ObjectMapperInstance.INSTANCE.getObjectMapper();
        return objectMapper.readValue(json, UserEntity.class);
    }

    /**
     * 测试Object to String
     * Benchmark 用于告诉 JMH 哪些方法需要进行测试,只能注解在方法上 
     */
    @Benchmark
    public String objectMapper2StringTest() throws JsonProcessingException {
        ObjectMapper objectMapper = ObjectMapperInstance.INSTANCE.getObjectMapper();
        return objectMapper.writeValueAsString(userEntity);
    }

    public static void main(String[] args) throws RunnerException {
        Options opt = new OptionsBuilder()
                .include(JsonJMHTest.class.getSimpleName())
                .build();
        new Runner(opt).run();
    }
}

测试结果

  • 使用了单例


    image.png
    image.png

    使用单例模式,String转对象的方法每秒可以执行420多万次,比new ObjectMapper的方式快了18倍;而对象转String的方法每秒可以执行830万次,性能提升了300倍

  • 未使用单例


    image.png

    测试结果可以看出,每次new一个ObjectMapper,在实现字符串转对象时每秒可以完成23万多次,而实现对象转Json字符串每秒仅可完成2.7万次

相关文章

网友评论

      本文标题:JMH基准测试

      本文链接:https://www.haomeiwen.com/subject/vlzuadtx.html