You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.15 11:22:58