我正在使用JMH,我发现了一些难以理解的东西:我有一个用@Benchmark注释的方法,并且我设置了measurementIterations(3)。该方法被调用了3次,但在每次迭代调用中,该函数都会运行相当大且随机的次数。
我的问题是:这个数字是完全随机的吗?有没有办法控制它,并确定函数在一次迭代中应该运行多少次?如果函数会随机运行一次,那么设置measurementIterations有什么意义呢?
发布于 2016-04-05 16:51:19
measurementIterations定义了您想要测量基准测试的多少次度量迭代。我不知道您指定了哪些参数,但在默认情况下,JMH按时间运行基准测试(默认情况下,我猜是1秒)。这意味着在该时间范围内尽可能频繁地调用基准测试方法。可以指定在一次迭代中调用该方法的频率(->批处理)。
我建议研究JMH:http://hg.openjdk.java.net/code-tools/jmh/file/tip/jmh-samples/src/main/java/org/openjdk/jmh/samples/提供的JMH示例,它们是对JMH的一个非常好的介绍,并涵盖了您在基准测试中容易犯下的陷阱。
发布于 2016-09-15 21:49:02
迭代的次数取决于不同的JMH模式,我想你一定是使用了模式,它会执行各种迭代。/////////////////////////////////////////////////////////////////////////////////
Mode.Throughput: Calculate number of operations in a time unit.
Mode.AverageTime: Calculate an average running time.
Mode.SampleTime: Calculate how long does it take for a method to run
(including percentiles).
Mode.SingleShotTime: Just runs a method
once (useful for cold-testing mode).////////////////////////////////////////////////////////////////////////////////
例如,使用模式"Mode.SingleShotTime",它将精确地执行您在运行中提到的迭代次数(见下文)。 //示例类
public static void main(String[] args) throws RunnerException {
Options opt = new OptionsBuilder()
.include(JMHSample_01_HelloWorld.class.getSimpleName())
.warmupIterations(1)// number of times the warmup iteration should take place
.measurementIterations(1)//number of times the actual iteration should take place
.forks(1)
.shouldDoGC(true)
.build();
new Runner(opt).run();
}发布于 2016-04-05 16:57:00
JMH正在进行热身迭代,这些迭代不是测量到的,但对于有效的结果是必要的。
measurementIterations定义了应该测量的迭代次数。这不包括预热,因为预热是不测量的。
https://stackoverflow.com/questions/36400947
复制相似问题