Java VectorAPI的JMH基准测试结果不符合预期的问题咨询
Java VectorAPI的JMH基准测试结果不符合预期的问题咨询
大家好,我最近在尝试用JMH对Java VectorAPI做基准测试,想验证向量运算的性能优势,但跑出来的结果完全不符合预期,想请教下各位前辈哪里出了问题。
先说说我的测试场景:我准备了两个1000万元素的float数组,想测试它们的向量加法性能,代码如下:
import org.openjdk.jmh.annotations.*; import jdk.incubator.vector.FloatVector; import jdk.incubator.vector.VectorSpecies; import java.io.IOException; import java.util.concurrent.TimeUnit; public class BenchmarkVector { static final VectorSpecies<Float> SPECIES = FloatVector.SPECIES_PREFERRED; static int size = 10_000_000; // Large dataset static float[] array1 = new float[size]; static float[] array2 = new float[size]; public static void main(String[] args) throws IOException { for (int i = 0; i < size; i++) { array1[i] = i * 1.0f; array2[i] = i * 2.0f; } org.openjdk.jmh.Main.main(args); } @Benchmark @BenchmarkMode(Mode.AverageTime) @Warmup(iterations = 5, time = 100, timeUnit = TimeUnit.MILLISECONDS) @Measurement(iterations = 5, time = 100, timeUnit = TimeUnit.MILLISECONDS) public static float[] addTwoVectorArrays() { var v1 = FloatVector.fromArray(SPECIES, array1, 0); var v2 = FloatVector.fromArray(SPECIES, array2, 0); var result = v1.add(v2); return result.toArray(); } }
写完跑起来我才反应过来,当前的addTwoVectorArrays方法只处理了数组开头的一小段元素(长度就是SPECIES对应的向量长度),剩下的99%+的元素根本没参与运算,这肯定不对。但我不确定正确的循环遍历写法应该怎么写才能充分利用VectorAPI的批量处理能力?
另外还有几个疑问想请教:
- 我当前的JMH注解配置合理吗?热身5次每次100ms、测量5次每次100ms会不会太短,导致JIT还没完成优化,影响测试结果?
- 这个方法直接返回结果数组,会不会被JVM做死代码消除优化?是不是需要用JMH的
Blackhole来消费结果,保证运算逻辑真的被执行? - 还有什么其他需要注意的点,能让我的基准测试结果更准确,真正体现出VectorAPI的性能优势?
麻烦各位大佬帮忙指点一下,谢谢啦!
备注:内容来源于stack exchange,提问作者Mandroid
相关产品推荐
相关产品推荐

