JMH是基于CPU时间还是墙钟时间计算每个时间单位内的操作次数?

4

考虑到 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

因此,我想知道得分列是使用挂钟时间还是CPU时间计算的,以便我可以准确地解释基准测试结果。

1
也许你可以通过查看 jmh 的源代码来找到答案,网址为 https://hg.openjdk.java.net/code-tools/jmh/file/99d7b73cf1e3 - Alexandre Cartapanis
1个回答

0

正如我所担心的那样,由于墙钟时间和 CPU 时间并不是唯一的选择,我错过了基本信息并且我的问题表述得很糟糕。我遵循 Alexandre Cartapanis 的建议并查看了 JMH 的源代码。我发现 BenchmarkGenerator 类生成基准测试时依赖于 System.nanoTime()。

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


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