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

JMH多重基准测试独立运行的不同结果

东弘扬
2023-03-14

我通过JMH进行了一些基准测试

假设我在一个Java文件中列出了三个基准测试

    @Benchmark
    @Threads(value = 2)
    @Warmup(iterations = 10)
    @Fork(value = 2)
    @Measurement(iterations = 10)
    public String benchmarkA() {
        ...
    }

    @Benchmark
    @Threads(value = 2)
    @Warmup(iterations = 10)
    @Fork(value = 2)
    @Measurement(iterations = 10)
    public String benchmarkB() {
       ...
    }

    @Benchmark
    @Threads(value = 2)
    @Warmup(iterations = 10)
    @Fork(value = 2)
    @Measurement(iterations = 10)
    public String benchmarkC() {
        ...
    }

每种方法都对服务于相同目的的不同算法进行基准测试。当我一起运行所有基准测试时,与逐个运行基准测试相比,结果会有所不同。

例如,在Java文件上仅使用onw基准执行JMH运行。

    @Benchmark
    @Threads(value = 2)
    @Warmup(iterations = 10)
    @Fork(value = 2)
    @Measurement(iterations = 10)
    public String benchmarkA() {
        ...
    }

如果只运行此方法,此方法的结果会更好,但是如果使用更多基准,结果会更差。

假设基于结果的基准测试

我还尝试改变基准的顺序(按字典顺序执行),结果是一样的。就好像基准的数量会影响结果一样。

原因是什么?

共有2个答案

公西繁
2023-03-14

事实上,CPU频率的动态缩放可能是这个问题的原因之一。

我发现这个问题对准备基准测试环境非常有帮助。

鄢子平
2023-03-14

每个基准测试都在自己的JVM中执行(除非明确设置为其他行为),因此不应发生交叉基准测试污染。可能发生的并且非常常见的是CPU的热节流。如果您在无法控制CPU频率的环境中进行基准测试,典型的行为是第一个基准测试将CPU频率推高,然后基准测试将受到限制。您可以通过切换到用户控制的电源调节器并为CPU设置固定频率来控制Linux环境中的此变量。

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

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

  • 我为Aeron的演示做了一些基准测试,但我发现,如果我对相同的传输使用不同的工具,我得到的结果略有不同。 例如,如果我使用HDR直方图,我得到的结果与维护人员在测试中得到的数字一致: 我的代码https://github.com/easy-logic/transport-benchmarks/blob/master/aeron-ping/src/main/java/io/easylogic/ben

  • 我正在使用JMH,一个OpenJDK微基准测试工具。构建过程创建<代码>微基准。我用调用并传递jar名称和JMH参数的jar。 我想知道我们应该使用选项运行基准测试吗?为什么? 换句话说,我是否应该使用以下命令运行基准测试:

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

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