newInstance vs new in jdk-9/jdk-8 and jmh 在jdk-9/jdk-8和jmh中的newInstance与new的区别

13 浏览
0 Comments

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

有人能解释一下为什么会有这么大的差异吗?

0