JEP 177: Optimize java.text.DecimalFormat.format
Оптимизация java.text.DecimalFormat.format
| Автор | Joseph D. Darcy |
| Ответственный | Joe Darcy |
| Тип | Feature |
| Область | JDK |
| Статус | Closed / Delivered |
| Выпуск | 8 |
| Компонент | core-libs |
| Обсуждение | core dash libs dash dev at openjdk dot java dot net |
| Трудоёмкость | M |
| Длительность | L |
| Рецензенты | Alan Bateman, Olivier Lagneau |
| Одобрен | Mark Reinhold |
| Создан | 2013/02/10 20:00 |
| Обновлён | 2014/11/03 23:59 |
| Задача | 8046167 |
Аннотация
Оптимизировать java.text.DecimalFormat.format, используя числовые свойства целочисленной арифметики и арифметики с плавающей точкой, чтобы ускорить случаи с двумя или тремя цифрами после десятичной точки.
Цели
Ускорить распространённые варианты использования DecimalFormat.
Критерии успеха
Ускорение не менее чем в 2 раза (2X) на интересующих нас микробенчмарках.
Описание
Наибольший интерес представляют преобразования в десятичный формат с двумя и тремя цифрами после десятичной точки. Вместо дорогостоящих делений с плавающей точкой, которые выделяют и округляют дробные цифры, можно умножить дробную часть на 100,0 или 1000,0 с плавающей точкой, преобразовать произведение в целое значение, а затем преобразовать полученное целое число в десятичную запись. Хотя такой способ быстрее, нужно следить за тем, чтобы избежать двойного округления и других числовых ловушек.
Разбор случаев, основанный на свойствах того, какие дробные десятичные значения точно представимы в двоичном виде, сводит округление после умножения к вычислению в стиле поиска по таблице.
Тестирование
Помимо запуска существующих тестов JCK и регрессионных тестов, будут разработаны новые тесты, нацеленные на граничные случаи оптимизированного пути выполнения кода. Кроме того, производительность кода будет оценена с помощью микробенчмарков на современных аппаратных платформах.
Риски и допущения
Исследовательская работа с оптимизированной реализацией выявила давнюю числовую ошибку в DecimalFormat: некоторые случаи, близкие к середине между двумя значениями, округлялись неправильно. В Java SE 8 спецификация DecimalFormat дополняется, чтобы явно требовать правильного округления во всех случаях.
Влияние
-
Совместимость: в JDK 7 (правильное), но изменённое числовое поведение будет включаться только флагом агрессивной оптимизации, чтобы ограничить влияние на совместимость поведения в этой линейке выпусков. В Java SE 8 правильное числовое поведение всегда будет требоваться спецификацией.
-
Производительность и масштабируемость: многие распространённые случаи с новым алгоритмом будут выполняться быстрее; в остальных случаях будет использоваться прежний код.
-
TCK: было бы полезно добавить несколько новых тестовых случаев в JCK 8.