跳到主要内容

JEP 177:优化 java.text.DecimalFormat.format

概括

java.text.DecimalFormat.format通过利用整数和浮点运算的数值属性来加速小数点后两位或三位数字的情况进行优化。

目标

更快地实现常见用法DecimalFormat

成功指标

感兴趣的微基准至少加速 2 倍。

描述

最感兴趣的十进制格式转换是小数点后两位和三位数字的十进制格式转换。可以执行小数部分乘以 100.0 或 1000.0 的浮点乘法,将乘积转换为整数值,然后将所得整数转换为小数,而不是执行昂贵的浮点除法来隔离和舍入小数位。虽然此过程更快,但必须注意避免双舍入和其他数值风险。

使用可以用二进制精确表示小数十进制值的属性的案例分析将后乘舍入减少为查找表样式计算。

测试

除了运行现有的 JCK 和回归测试之外,还将开发针对优化代码路径的边界情况的新测试。此外,代码的性能将使用当代硬件平台上的微基准进行评估。

风险和假设

优化实现的探索性工作揭示了长期存在的数值错误DecimalFormat:一些接近中途的情况没有正确舍入。 Java SE 8 中正在修改的规范,DecimalFormat明确要求始终正确舍入。

影响

  • 兼容性:在 JDK 7 上,(正确)但更改的数值行为仅在积极优化标志下启用,以限制该版本系列中行为兼容性的影响。在 Java SE 8 中,规范始终要求正确的数值行为。

  • 性能/可扩展性:使用新算法,许多常见情况会更快;其他情况将回退到使用旧代码。

  • TCK:JCK 8 中的一些新测试用例会很有帮助。