JMH测量迭代次数

10
我正在使用JMH,但有些地方我不太明白:我有一个被注解为@Benchmark的方法,并且我设置了measurementIterations(3)。该方法会被调用3次,但在每次迭代调用中,函数运行了相当多且随机的次数。
我的问题是:这个数字完全是随机的吗?是否有一种方法来控制它,并确定在迭代内函数应该运行多少次?如果无论如何函数都将运行随机次数,那么设置measurementIterations的重要性在哪里?
4个回答

9
measurementIterations 定义了您要测量基准测试的测量迭代次数。我不知道您指定了哪些参数,但默认情况下,JMH是按时间为基础运行基准测试的(我猜默认时间为1秒)。这意味着在该时间范围内尽可能多地调用基准方法。有可能指定在一个迭代中应该调用方法的频率(->批处理)。
我建议学习由JMH提供的JMH示例:http://hg.openjdk.java.net/code-tools/jmh/file/tip/jmh-samples/src/main/java/org/openjdk/jmh/samples/它们是JMH的很好介绍,并涵盖您在基准测试中容易犯的错误。

5

迭代次数取决于不同的JMH模式,我认为你可能正在使用Avgtime模式,它会执行多个迭代。.

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(); 
}

0

是的,在每次迭代中,方法运行的次数是随机的(它是方法可以运行的最大次数)。次数并不重要。重要的是每次使用的平均时间。

此外,您可以使用measurementIterations()控制要运行多少次迭代,并使用measurementTime()控制每次迭代的持续时间。

例如,如果您想要只运行1次迭代并将其持续时间设为1毫秒,而不进行热身,则将warmupIterations设置为0,measurementTime设置为1毫秒,measurementIterations设置为1。如下:

    Options opt = new OptionsBuilder()
            .include(xxx.class.getSimpleName())
            .warmupIterations(0)
            .measurementTime(TimeValue.milliseconds(1))
            .measurementIterations(1)
            .forks(1)
            .build();

多次迭代的意义:运行得越多,结果应该更可靠。


0

JMH正在进行预热迭代,这些迭代不被测量,但对于有效结果是必要的。

measurementIterations定义应该测量多少次迭代。这不包括预热,因为预热不被测量。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接