newInstance vs new in jdk-9/jdk-8 and jmh 在jdk-9/jdk-8和jmh中的newInstance与new的区别
newInstance vs new in jdk-9/jdk-8 and jmh 在jdk-9/jdk-8和jmh中的newInstance与new的区别
我在这里看到了很多比较并尝试回答哪个更快的线程:newInstance 还是 new operator。
从源代码来看,newInstance 应该会慢得多,我的意思是它进行了很多安全检查并使用了反射。我决定进行测量,首先运行 jdk-8。这里是使用 jmh 的代码。
我不认为在这里有什么大的意外(JIT 进行了很多优化,使得这种差异并不是那么大):
newInstance 5 7.762 ± 0.745 ns/op
newOperator 5 4.714 ± 1.480 ns/op
newInstance ss 5 10666.200 ± 4261.855 ns/op
newOperator ss 5 1522.800 ± 2558.524 ns/op
对于热代码的差异大约为 2 倍,对于单次执行时间则更糟糕。
现在我切换到 jdk-9(build 157,如果有关系的话)并运行相同的代码。
结果如下:
newInstance 5 314.307 ± 55.054 ns/op
newOperator 5 4.602 ± 1.084 ns/op
newInstance ss 5 10798.400 ± 5090.458 ns/op
newOperator ss 5 3269.800 ± 4545.827 ns/op
热代码的差异达到了惊人的 50 倍。我使用的是最新的 jmh 版本(1.19.SNAPSHOT)。
在测试中再添加一个方法之后:
newInstanceJDK9 5 50.659 ± 7.964 ns/op
这是在 jdk-9 上的整体结果:
newInstance 5 308.342 ± 107.563 ns/op
newInstanceJDK9 5 50.659 ± 7.964 ns/op
newOperator 5 4.554 ± 0.616 ns/op
有人能解释一下为什么会有这么大的差异吗?