字符串刚刚变得更快了

主要观点:在 JDK 25 中改进了String类的性能,使String::hashCode函数大多可常量折叠,对使用String作键的静态不可变Map性能提升显著。
关键信息

  • 通过改进,String::hashCode首次调用时计算哈希码并存储在私有字段String.hash中,后续调用变快。
  • @Stable注解告知虚拟机可读取字段一次且信任其不再改变,从而实现常量折叠,提升性能。
  • 改进可使包含String键的不可变Map及相关操作性能大幅提升,如通过Map查找MethodHandle调用native方法。
  • 存在特殊情况,若String哈希码为 0 则常量折叠不生效,未来有望修复。
  • @Stable注解仅适用于内部 JDK 代码,正在开发新 JEP 让用户代码间接受益。
    重要细节
  • 示例中展示了维护不可变Map并利用改进后的性能,如通过SYSTEM_CALLS.get(“malloc”).invokeExact(16L)分配和释放内存。
  • 基准测试显示 JDK 24 和 JDK 25 中StringHashCodeStatic.nonZero的性能差异巨大,从 4.632ns/op 降至 0.571ns/op。
  • 解释了@Stable注解如何使虚拟机能对整个操作链进行常量折叠,直接调用native方法提升性能。
阅读 11
0 条评论