考虑下面的jmh测试。
@State(Scope.Thread)
public class Test {
private int value;
@Benchmark
public int testF() {
return f(value);
}
@Benchmark
public int testG() {
return g(value);
}
}
为函数f
和g
的广泛参数进行基准测试的最佳方法是什么?@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());
}
从基准测试方法更改状态通常是一个坏主意吗?
您可以使用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参数列表实现同样的效果,并避免对它们进行迭代。你能告诉我怎么做吗?