问题描述
我想编写一个基准测试来跟踪执行某些 Java 代码所需的最大、最小和平均时间。
我阅读了 JMH(Java Microbenchmark Harness),它似乎符合我的需求,但我不太确定我应该使用哪种模式:
-
Mode.Throughput
通过在限时迭代中连续调用基准方法并计算我们执行该方法的次数来测量原始吞吐量。这似乎不是我要找的。p>
-
Mode.AverageTime
衡量执行基准方法所需的平均时间。这应该是我需求的 1/3。
-
Mode.SingleShottime
衡量单个基准方法执行运行所需的时间。这似乎不是我要找的。p>
-
Mode.SampleTime
对我来说是最晦涩的。Documentations on examples 声明它通过在有时间限制的迭代中运行方法来“采样”执行时间,但它不是测量总时间,而是测量在“某些”基准方法中花费的时间调用。什么意思?
什么模式可以为我提供最小和最大时间?是否有更多模式,或者是否有其他框架可以完成这项工作?
解决方法
如果您使用 @Benchmark
运行 @BenchmarkMode(Mode.AverageTime)
,作为奖励,您将获得如下输出:
Result "StopAllBenchmarks.measureRight":
2.387 ±(99.9%) 0.307 ns/op [Average]
(min,avg,max) = (2.339,2.387,2.526),stdev = 0.080
CI (99.9%): [2.079,2.694] (assumes normal distribution)
注意 min,max