基准测试最容易测出「没有发生的计算」。这篇用 JMH 逐个触发:死代码消除、常量折叠、基准里的循环、逃逸分析,再看手写计时为什么不可靠。
# JMH version: 1.37 # VM version: JDK 21.0.12.1, OpenJDK 64-Bit Server VM, 21.0.12.1 # Blackhole mode: compiler (auto-detected, use -Djmh.blackhole.autoDetect=false to disable) # Warmup: 2 iterations, 1 s each # Measurement: 3 iterations, 1 s each # Threads: 1 thread, will synchronize iterations # JMH version: 1.37 a1_sqrtDiscarded 0.314 ± 0.003 ns/op a2_sqrtReturned 0.591 ± 0.003 ns/op b1_sqrtConstant 0.313 ± 0.001 ns/op b2_sqrtStaticFinal 0.313 ± 0.001 ns/op b3_sqrtStateField 0.591 ± 0.002 ns/op c1_oneElement 0.628 ± 0.003 ns/op c2_loopOf1000 323.024 ± 4.85 ns/op e1_allocDiscarded 0.314 ± 0.002 ns/op e2_allocReturned 2.398 ± 0.028 ns/op e3_allocStoredToField 2.765 ± 0.034 ns/op p_parseInt 4.953 ± 0.019 ns/op z0_empty 0.332 ± 0.125 ns/op
第 1 批 1 次: 10500.00 ns/次 第 2 批 10 次: 929.20 ns/次 第 3 批 100 次: 890.42 ns/次 第 4 批 1000 次: 402.33 ns/次 第 5 批 10000 次: 126.92 ns/次 第 6 批 100000 次: 27.58 ns/次 第 7 批 1000000 次: 10.64 ns/次 第 8 批 10000000 次: 8.90 ns/次 第 9 批 10000000 次: 8.89 ns/次 第 10 批 10000000 次: 8.89 ns/次 (对照:第一部分里同一个操作的 JMH 基准 p_parseInt = 4.953 ns/op) 同一个程序 -Xint(只解释执行)的最后一批: 第 10 批 10000000 次: 1200.11 ns/次