为了解决其他人在这里表达的一些怀疑态度,我建议任何想要向自己或其他人证明的人都使用以下方法:
- 创建 JMH 项目
- 写一小段可矢量化的数学。
- 在 -XX:-UseSuperWord 和 -XX:+UseSuperWord(默认)之间运行他们的基准测试翻转
- 如果未观察到性能差异,则您的代码可能未进行矢量化
- 为确保安全,请运行基准测试,使其打印出程序集。在linux上,您可以享受perfasm profiler('-prof perfasm')查看并查看您期望的指令是否生成。
例:
@Benchmark
@CompilerControl(CompilerControl.Mode.DONT_INLINE) //makes looking at assembly easier
public void inc() {
for (int i=0;i<a.length;i++)
a[i]++;// a is an int[], I benchmarked with size 32K
}
带和不带标志的结果(在最近的Haswell笔记本电脑上,Oracle JDK 8u60):-XX:+UseSuperWord:475.073 ± 44.579 ns/op(每个op的纳秒数)-XX:-UseSuperWord:3376.364 ± 233.211 ns/op
热循环的程序集需要格式化并粘贴在这里,但这里有一个片段(hsdis.so 无法格式化一些AVX2矢量指令,所以我用-XX:UseAVX=1运行):-XX:+UseSuperWord(带有'-prof perfasm:intelSyntax=true')
9.15% 10.90% │││ │↗ 0x00007fc09d1ece60: vmovdqu xmm1,XMMWORD PTR [r10+r9*4+0x18]
10.63% 9.78% │││ ││ 0x00007fc09d1ece67: vpaddd xmm1,xmm1,xmm0
12.47% 12.67% │││ ││ 0x00007fc09d1ece6b: movsxd r11,r9d
8.54% 7.82% │││ ││ 0x00007fc09d1ece6e: vmovdqu xmm2,XMMWORD PTR [r10+r11*4+0x28]
│││ ││ ;*iaload
│││ ││ ; - psy.lob.saw.VectorMath::inc@17 (line 45)
10.68% 10.36% │││ ││ 0x00007fc09d1ece75: vmovdqu XMMWORD PTR [r10+r9*4+0x18],xmm1
10.65% 10.44% │││ ││ 0x00007fc09d1ece7c: vpaddd xmm1,xmm2,xmm0
10.11% 11.94% │││ ││ 0x00007fc09d1ece80: vmovdqu XMMWORD PTR [r10+r11*4+0x28],xmm1
│││ ││ ;*iastore
│││ ││ ; - psy.lob.saw.VectorMath::inc@20 (line 45)
11.19% 12.65% │││ ││ 0x00007fc09d1ece87: add r9d,0x8 ;*iinc
│││ ││ ; - psy.lob.saw.VectorMath::inc@21 (line 44)
8.38% 9.50% │││ ││ 0x00007fc09d1ece8b: cmp r9d,ecx
│││ │╰ 0x00007fc09d1ece8e: jl 0x00007fc09d1ece60 ;*if_icmpge
有乐趣冲进城堡!