java - 如何用 JMH 测量平均冷启动时间?
问题描述
在 JMH(Java Microbenchmark Harness)中,我们可以使用
@BenchmarkMode(Mode.AverageTime)
@Warmup(iterations = 10)
@Measurement(iterations = 10)
评估 JVM 预热后执行的平均时间。
我们也可以使用
@BenchmarkMode(Mode.SingleShotTime)
@Measurement(iterations = 1)
估计执行的冷启动时间。但这只会执行一次基准测试,这可能会引入偏差。那么有没有什么方法可以评估JMH中冷启动的平均时间呢?
解决方案
根据Alexey 本人的说法(尽管从 2014 年开始):
单次基准测试最初注定要在多个分叉上运行一次测量迭代——估计“冷”性能的场景。但在许多情况下,您可能需要更多的测量迭代,特别是如果您只运行一个分叉,因为会生成更多的样本。
@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.NANOSECONDS)
public class AverageSingleShot {
public static void main(String[] args) throws Exception {
Options opt = new OptionsBuilder()
.include(AverageSingleShot.class.getSimpleName())
.build();
new Runner(opt).run();
}
@Fork(100)
@Benchmark
@BenchmarkMode(Mode.SingleShotTime)
public int test() {
return ThreadLocalRandom.current().nextInt() + ThreadLocalRandom.current().nextInt();
}
}
除了这会告诉你平均值的事实(见100
):
Benchmark Mode Cnt Score Error Units
AverageSingleShot.test ss 100 41173.540 ± 2871.546 ns/op
你也会得到Percentiles
一个Histogram
.
推荐阅读
- python - VTK 循环遍历图像中的像素
- r - 通过提取列名中的模式重命名数据框的所有列
- java - 如何修复 Spring 中的“Coach 无法解析为类型”错误
- ruby-on-rails - WkWebView 有时会丢失会话变量
- c++ - 执行 Sendmessage 函数后从 ComboBox 获取错误的字符串
- numpy - IndexError:numpy中数组的索引太多
- java - JavaFX:在迭代时删除特殊的日子
- postgresql - AWS RDS PostgreSQL 小更新
- javascript - Jquery Validation All Errors 仅显示在一个警告框中
- python - 如何在 TensorFlow 2.0 中组合两个渐变磁带