Mockito测试中未抽方法的代码为何也获JIT优化?实验求证
你的猜测完全正确!
首先得给你点个赞,这个实验设计和后续的猜测都很到位。你观察到的现象核心原因就是JVM的JIT(即时编译器)确实在针对你调用的mvc.perform()及其内部依赖的方法进行优化,和你有没有把代码抽成自定义方法关系不大。
咱们拆解一下背后的逻辑:
- JIT的优化核心是识别热点方法——也就是被频繁调用的方法。当一个方法被调用达到一定次数(HotSpot虚拟机默认是10000次左右,可配置),JIT就会把它从解释执行的字节码编译成机器码,后续调用就能直接执行机器码,速度大幅提升。
- 在你的
testFileA里,虽然每个测试方法都重复写了mvc.perform(...)这段代码,但本质上每次都是在调用MockMvc类的perform方法、MockMvcRequestBuilders.post方法,还有andDo、andExpect这些链式调用里的方法。第一次运行test1时,这些方法都是第一次被调用,处于解释执行状态,所以耗时较长;而到了test2、test3,这些方法已经被调用了多次,达到了JIT的热点阈值,被编译成了机器码,所以后续调用速度就快了。 - 你抽出来的
abstractedCode()方法,其实只是把这些调用打包了一层,但JIT真正关注的是底层被调用的那些框架方法,所以testFileB的表现和testFileA一致——都是首次触发解释执行,后续享受JIT优化的红利。
补充个小细节:即使你在同一个测试方法里重复执行mvc.perform()多次,也会看到第一次慢、后面越来越快的现象,这也是因为JIT会在运行过程中持续优化热点代码。
内容的提问来源于stack exchange,提问作者Will
相关产品推荐
相关产品推荐

