XPerf
语言Java证据

jp-log-hot

主张

在进行级别检查之前构建日志字符串("x=" + x)即使在调试关闭时也会进行分配。使用 isDebugEnabled()(或结构化惰性参数)进行保护。

如何测量

  • 来源: J32_RuleEvidenceBatch.jsonl
  • JDK 27 (27+35),JVM 参数 -XX:+UseCompactObjectHeaders
  • 之前: concatAlways_debugOff_n1000
  • 之后: guarded_debugOff_n1000

运行时(本证据文件)

FieldValue
时间2026-10-23 亚洲/上海
before2838.115 ns_per_op, 23200.045 B/op
after6543.092 ns_per_op, 0.096 B/op
前/后比率~0.43× 时间(平均),分配仍然约 23200 B 对比 ~0

Lint 映射 / 策略

JDK 27 平均时间朝相反方向变化(约 0.43×),因为一个受保护的样本飙升到约 25 微秒;其他四个样本维持在约 0.4–3.5 微秒,紧挨着 concat 的约 2.6–3.7 微秒。分配仍然约为每操作 23200 字节,而对比约为 0。

在一个空闲的16核主机上(Temurin 21.0.13,负载0.96,warm 5,中位数为9)进行的后期方向检查不能替代这个JSONL。为1000个整数构建"x=" + x,关闭调试,每个样本重复200次:拼接中位数为1.129毫秒,保护中位数为0.062毫秒,约18倍。前四个保护样本为0.28–0.45毫秒,其余保持在0.048–0.062毫秒,所以如果保留这些早期样本,保护仍然占优。默认严重性保持关闭。

限制

在这台机器上进行微基准测试;请参见 scripts/run-static-vs-hotspot.sh。不要随意编造比率。语料残差 ≠ 加速比。