JEP 177: Optimize java.text.DecimalFormat.format | 优化 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 中的一些新测试用例将会有所帮助。