JMH 为什么默认给每个基准启动一个新 JVM?预热多少才够?不同 fork 之间的结果能差多少?这篇设计一个共用调用点的基准,让 fork 的作用在数字里出现。
-f 0(全部在 JMH 主进程里,共用一个 JVM 的 JIT 状态):
b1_monomorphic 441.452 ± 74.268 ns/op
b2_polymorphic 2727.982 ± 18.717 ns/op
b3_monomorphicAgain 2042.844 ± 94.846 ns/op
-f 1(每个基准一个新的 fork):
b1_monomorphic 447.773 ± 7.292 ns/op
b2_polymorphic 2728.227 ± 35.121 ns/op
b3_monomorphicAgain 447.592 ± 48.639 ns/op没有预热时每次迭代的 ns/op: [445.787, 449.392, 445.498, 443.512, 447.084, 447.856] -wi 3 -i 3 时全部 6 次迭代(前 3 次是预热)的 ns/op: [445.56, 447.668, 447.553, 444.893, 443.453, 446.104] 把每次测量缩短到 10 毫秒、没有预热(-r 10ms)时每次迭代的 ns/op: [616.885, 436.2, 430.678, 441.073, 452.781, 450.952, 447.705, 459.432, 436.112, 449.086]
h_identityHashMapLookups: 各 fork 的均值 [2321.92, 2345.58, 2312.81, 2315.21, 2352.59];最小 2312.81,最大 2352.59,最大/最小 = 1.017;JMH 汇总 [('h_identityHashMapLookups', 2329.622, 18.342)]
b2_polymorphic: 各 fork 的均值 [2728.24, 2728.71, 2729.78, 2731.23, 2732.95];最小 2728.24,最大 2732.95,最大/最小 = 1.002;JMH 汇总 [('b2_polymorphic', 2730.182, 3.951)]