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

如何无需编写多方法,在JMH中用不同文件批量测试XML处理器?

如何在JMH中用单个基准方法测试多个XML文件?

别担心,JMH早就为这种批量参数化测试的场景提供了完美解决方案——@Param注解,完全不用手写25个重复的基准方法!

核心思路:用@Param参数化你的文件名

@Param注解可以让JMH为你指定的每个参数值,自动生成独立的基准测试实例。每个文件都会执行你定义的热身、测量逻辑,最终结果会清晰区分每个文件的性能数据。

修改后的代码示例

下面是适配你需求的代码,我基于你给出的片段做了调整:

import org.openjdk.jmh.annotations.*;
import java.util.concurrent.TimeUnit;

@State(Scope.Benchmark) // 必须添加State注解,让参数在基准测试中生效
public class MyBenchmark {
    // 直接在这里列出25个文件名,或者用动态方式加载(后面会讲)
    @Param({
        "file1.xml", "file2.xml", "file3.xml", 
        // ... 这里继续添加剩下的22个文件名
        "file25.xml"
    })
    private String xmlFileName;

    @Benchmark
    @BenchmarkMode(Mode.SingleShotTime)
    @OutputTimeUnit(TimeUnit.MILLISECONDS)
    @Warmup(iterations = 10, time = 1, timeUnit = TimeUnit.MILLISECONDS)
    @Measurement(iterations = 100)
    public void processXml() {
        // 这里调用你的XML处理器方法,传入参数化的文件名
        yourXmlProcessingMethod(xmlFileName);
    }

    // 替换成你实际的XML处理逻辑
    private void yourXmlProcessingMethod(String fileName) {
        // 你的代码:读取文件、解析XML等
    }
}

进阶技巧:动态加载文件名(避免硬编码)

如果25个文件名硬编码太麻烦,可以通过JMH的OptionsBuilder动态加载目录下的所有XML文件,不用修改注解:

import org.openjdk.jmh.runner.Runner;
import org.openjdk.jmh.runner.options.Options;
import org.openjdk.jmh.runner.options.OptionsBuilder;
import java.io.File;
import java.util.Arrays;

public class BenchmarkRunner {
    public static void main(String[] args) throws Exception {
        // 从指定目录读取所有XML文件的绝对路径
        String[] xmlFiles = Arrays.stream(new File("path/to/xml/dir").listFiles())
                .filter(f -> f.getName().endsWith(".xml"))
                .map(File::getAbsolutePath)
                .toArray(String[]::new);

        Options opt = new OptionsBuilder()
                .include(MyBenchmark.class.getSimpleName())
                .param("xmlFileName", xmlFiles) // 动态传入文件名参数
                .build();

        new Runner(opt).run();
    }
}

// 基准类简化,不用在@Param里硬编码
@State(Scope.Benchmark)
public class MyBenchmark {
    @Param
    private String xmlFileName;

    // 下面的基准方法和之前一样...
}

运行效果

执行后,JMH会为每个文件名单独执行热身和测量迭代,最终输出的结果会包含每个文件对应的SingleShotTime指标,你可以直接对比不同XML文件的处理性能。

内容的提问来源于stack exchange,提问作者Tri Nguyen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:28:11