【问题标题】:Does JMH calculate operations per time unit based on CPU time or on wall-clock time?JMH 是否根据 CPU 时间或挂钟时间计算每个时间单位的操作?
【发布时间】:2020-01-19 22:39:12
【问题描述】:

考虑到 JMH 的默认使用情况,我想确定 JMH 的测量基于哪种类型的时间:CPU 时间或挂钟。

我尝试查看 JMH 官方示例 (https://openjdk.java.net/projects/code-tools/jmh/)、教程(在 Jenkov、Baeldung、Mykong 等),但未能准确找到这些信息(我承认我可能错过了一些文档或一般信息基准)。

例如,在示例 35 (https://hg.openjdk.java.net/code-tools/jmh/file/99d7b73cf1e3/jmh-samples/src/main/java/org/openjdk/jmh/samples/JMHSample_35_Profilers.java) 中,我们有一个输出示例:

        Benchmark                              (type)  Mode  Cnt     Score    Error   Units

          JMHSample_35_Profilers.Maps.test     hashmap  avgt    5  1553.201 ±   6.199   ns/op

          JMHSample_35_Profilers.Maps.test     treemap  avgt    5  5177.065 ± 361.278   ns/op

因此,我想知道 Score 列是使用 Wall-clock time 还是 CPU Time 计算的,以便我可以准确地解释基准测试结果。

【问题讨论】:

标签: java benchmarking jmh cpu-time


【解决方案1】:

正如我所担心的那样,我错过了基本信息并糟糕地提出了我的问题,因为挂钟和 CPU 时间不是唯一的选择。我按照 Alexandre Cartapanis 的建议查看了 JMH 的源代码。我发现生成基准测试的类BenchmarkGenerator 依赖于System.nanoTime()。

此外,根据System.nanoTime() documentationKevin Bourrillion's answer 的另一个问题,我得出的结论是,默认情况下,JMH 根据一些任意但固定的源(就像 System.nanoTime())来测量时间。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-02
    • 2013-07-04
    • 1970-01-01
    • 2021-05-12
    • 1970-01-01
    • 2012-01-07
    • 1970-01-01
    相关资源
    最近更新 更多