Benchmark Mode Cnt Score Error Units
Sample_16_CompilerControl.baseline avgt 0.285 ns/op
Sample_16_CompilerControl.blank avgt 0.288 ns/op
Sample_16_CompilerControl.dontinline avgt 1.149 ns/op
Sample_16_CompilerControl.exclude avgt 9.628 ns/op
Sample_16_CompilerControl.inline avgt 0.284 ns/op
通过这些注解, 会告诉JVM如何在运行时去优化这些代码的执行
@CompilerControl(CompilerControl.Mode.DONT_INLINE): 禁用方法内联
@CompilerControl(CompilerControl.Mode.INLINE) : 强制使用方法内联
@CompilerControl(CompilerControl.Mode.EXCLUDE) : 不对其进行编译优化, 强行使用解释执行
禁用方法内联, 为什么耗时那么多?
方法内联可以消除方法调用的成本
你如果分为多个方法, JVM总要去方法区去找将要调用的对象和方法吧, 总要去做一些参数指针的复制吧, 寄存器肯定会被反复操作, 自然就慢下来了
如果使用方法内联是什么效果呢? 相当于把代码直接嵌套进去了, 两个方法变成了一个方法, 调用这个对象不用找来找去了, 所以节约了大量的时间
那JIT会对代码进行分析, 对于频繁调用的方法会进行内联的优化
那么未内联的和内联的代码执行起来性能就会发生差距, 但逻辑却一致
这个是JVM的JIT提供的功能, 也是为什么Java执行效率接近C的原因;
C, golang之类的语言, 在编译时就完成了所有的编译, 运行时不会改动机器码指令
但是Java这一步是在JIT里做的, 所以Java越执行越快
回到我们的例子中
那么我们这个测试有什么用呢?
我们可以知道我们写的代码在内联能给我们提升多大优势
有些代码是不能内联的, 因为实现类可能是参数传入的, 那么JVM就不会对其进行优化
但如果我们JMH进行测试, 内联能给我们的功能较大的提升, 那么我们就要想办法优化代码, 让JVM可以对其进行内联优化