jp-log-hot
主张
在进行级别检查之前构建日志字符串("x=" + x)即使在调试关闭时也会进行分配。使用 isDebugEnabled()(或结构化惰性参数)进行保护。
如何测量
- 来源:
J32_RuleEvidenceBatch.jsonl - JDK 27 (27+35),JVM 参数
-XX:+UseCompactObjectHeaders - 之前:
concatAlways_debugOff_n1000 - 之后:
guarded_debugOff_n1000
运行时(本证据文件)
| Field | Value |
|---|---|
| 时间 | 2026-10-23 亚洲/上海 |
| before | 2838.115 ns_per_op, 23200.045 B/op |
| after | 6543.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。不要随意编造比率。语料残差 ≠ 加速比。