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 中的一些新测试用例将会很有帮助。