实例类
@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();
}
}
测试结果
-
使用了单例
使用单例模式,String转对象的方法每秒可以执行420多万次,比new ObjectMapper的方式快了18倍;而对象转String的方法每秒可以执行830万次,性能提升了300倍
-
未使用单例
测试结果可以看出,每次new一个ObjectMapper,在实现字符串转对象时每秒可以完成23万多次,而实现对象转Json字符串每秒仅可完成2.7万次