java - JMH 多个基准 单独运行的不同结果

标签 java benchmarking jmh

我通过 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() {
        ...
    }

如果仅运行此方法,则此方法的结果会更好,但在基准测试更多的情况下,结果会更差。

假设结果明智的基准测试 A > 基准测试 B > 基准测试 C 通过单独运行它们,如果我一次性运行它们,它们之间的差异就会被放大。

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

可能是什么原因?

最佳答案

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

关于java - JMH 多个基准 单独运行的不同结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65065212/

相关文章:

java - 如何识别此错误 "java.lang.NullPointerException"的来源?

java - 无法在 Liferay 6.2 社区版中部署 Liferay Hook

java - 未定义 Base 类型的子方法

benchmarking - Go 语言基准测试?

performance - 在 Linux 上本地对 Apache 进行基准测试的好方法是什么?

java - JMH Sample 和 SingleShot 之间的区别

java - 验证简单 for/lambda 比较的 JMH 测量

java - 有没有办法以编程方式更改手机上的 Mac 地址?

MySQL 5.1 : how can i use benchmark() command to test a call to a stored procedure?

java - 测量 Java 中对象创建的性能