openjdk.ruOpenJDK на русском

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.