java - JMH 是根据 CPU 时间还是挂钟时间来计算每个时间单位的操作?

标签 java benchmarking jmh cpu-time

考虑到 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 列是使用挂钟时间还是 CPU 时间计算的,以便我可以准确地解释基准测试结果。

最佳答案

正如我担心的那样,我错过了基本信息并且问题的表述很糟糕,因为挂钟和 CPU 时间不是唯一的选择。我听从了 Alexandre Cartapanis 的建议并查看了 JMH 的源代码。我发现类(class) BenchmarkGenerator产生基准的 System.nanoTime() 依赖于 System.nanoTime()。

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

关于java - JMH 是根据 CPU 时间还是挂钟时间来计算每个时间单位的操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58001793/

相关文章:

java - AdMob 不会以编程方式加载

java - 在 MongoDB 中保留多重图

java - 如何用 Java 编写正确的微基准测试?

benchmarking - Spec2006 源代码变更

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

java - ReentrantReadWriteLock 读锁的性能?

Java 日语字符串大小(以字节为单位)

mysql - 我可以降低 MySQL 速度以突出显示哪个查询导致速度缓慢吗?

java - jmh 从基准改变状态的最佳实践

java - Gradle 构建错误