当前位置: 首页 > 知识库问答 >
问题:

jmh 关于从基准测试更改状态的最佳实践

柯曦
2023-03-14

考虑下面的jmh测试。

@State(Scope.Thread)
public class Test {
    private int value;

    @Benchmark
    public int testF() {
        return f(value);
    }

    @Benchmark
    public int testG() {
        return g(value);
    }
}

为函数fg的广泛参数进行基准测试的最佳方法是什么?@Param仅适用于少量不同的输入,@Setup(Level.Invocation)可能会影响结果的准确性。其他方法(如生成输入数组和增加基准内部的索引)会导致基准方法的状态更改。

private int[] values;
private int index;

@Setup
private void generateValues() {
    values = new int[0x10000];
    ...

    index = 0;
}

private int nextValue() {
    return values[index++ & 0xFFFF];
}

@Benchmark
private int testF() {
    return f(nextValue());
}

从基准测试方法更改状态通常是一个坏主意吗?

共有1个答案

严宏朗
2023-03-14

您可以使用OptionsBuilder,它允许您通过OptionsBuilder::params(String,String[])>以编程方式设置选项。示例中还演示了选项生成器。

 类似资料:
  • 我正在使用Java测量线束(JMH)对一些例程进行基准测试。我对获取每次运行的最大堆大小感兴趣。JMH的GC Profiler为我提供了诸如分配率和流失率之类的信息,但我正在寻找在测试运行期间堆获得的最大值。这能做到吗?

  • 我想制作一个基准来测量插入的时间,比较和并使用不同的初始大小。所以我使用JMH为这些目标创建了一个基准: 这个基准测试的问题是,它在迭代之间共享一个状态,因此初始大小会多次调用,并增加目标的大小。每次调用之前,我都会查看来初始化,但是javadocs中的警告说它不适合我的情况: 此级别仅适用于每次{@link Benchmark}方法调用超过一毫秒的基准测试。在临时的基础上验证对您的案例的影响也是

  • 我使用JMH对DOM解析器进行基准测试。我得到了非常奇怪的结果,因为第一次迭代实际上比后面的迭代运行得更快 有人能解释为什么会这样吗?此外,百分位数和所有数字意味着什么?为什么在第三次迭代后它开始变得稳定?一次迭代是否意味着整个基准测试方法的一次迭代?下面是我正在运行的方法

  • 我有几个用@Benchmark注释的大型基准类。在使用基准构建jar后,我可以使用以下命令运行所有这些类 如果我不想运行所有基准测试,如何指定要运行的基准测试?

  • 受另一个关于堆栈溢出的问题的启发,我编写了一个微型基准来检查,什么更有效: 有条件地检查零除数或 捕获和处理 下面是我的代码: 我对JMH完全陌生,不确定代码是否正确。 我的基准是正确的吗?你看到任何错误吗? 旁白:请不要建议询问https://codereview.stackexchange.com.对于Codereview,代码必须已按预期工作。我不确定这个基准是否能按预期工作。

  • 我正在使用向服务器发送REST请求的自定义Java库为HTTP服务器编写性能测试。在开始时,我正在执行数据准备阶段,以便获得一个要向服务器发送请求的对象列表。 现在,问题是,我可以使用注释测试可以注入基准函数的参数列表: 问题是,我希望通过Java参数列表实现同样的效果,并避免对它们进行迭代。你能告诉我怎么做吗?