RFR: 8334328: Reduce object allocation for FloatToDecimal and DoubleToDecimal [v9]
Shaojin Wen
duke at openjdk.org
Sun Jun 16 23:40:41 UTC 2024
> The current versions of FloatToDecimal and DoubleToDecimal allocate additional objects. Reducing these allocations can improve the performance of Float/Double.toString and AbstractStringBuilder's append(float/double).
>
> This patch is just a code refactoring to reduce object allocation, but does not change the Float/Double to decimal algorithm.
>
> The following code comments the allocated objects to be removed.
>
>
> class FloatToDecimal {
> public static String toString(float v) {
> // allocate object FloatToDecimal
> return new FloatToDecimal().toDecimalString(v);
> }
>
> public static Appendable appendTo(float v, Appendable app)
> throws IOException {
> // allocate object FloatToDecimal
> return new FloatToDecimal().appendDecimalTo(v, app);
> }
>
> private Appendable appendDecimalTo(float v, Appendable app)
> throws IOException {
> switch (toDecimal(v)) {
> case NON_SPECIAL:
> // allocate object char[]
> char[] chars = new char[index + 1];
> for (int i = 0; i < chars.length; ++i) {
> chars[i] = (char) bytes[i];
> }
> if (app instanceof StringBuilder builder) {
> return builder.append(chars);
> }
> if (app instanceof StringBuffer buffer) {
> return buffer.append(chars);
> }
> for (char c : chars) {
> app.append(c);
> }
> return app;
> // ...
> }
> }
> }
>
> class DoubleToDecimal {
> public static String toString(double v) {
> // allocate object DoubleToDecimal
> return new DoubleToDecimal(false).toDecimalString(v);
> }
>
> public static Appendable appendTo(double v, Appendable app)
> throws IOException {
> // allocate object DoubleToDecimal
> return new DoubleToDecimal(false).appendDecimalTo(v, app);
> }
>
> private Appendable appendDecimalTo(double v, Appendable app)
> throws IOException {
> switch (toDecimal(v, null)) {
> case NON_SPECIAL:
> // allocate object char[]
> char[] chars = new char[index + 1];
> for (int i = 0; i < chars.length; ++i) {
> chars[i] = (char) bytes[i];
> }
> if (app instanceof StringBuilder builder) {
> return builder.append(chars);
> }
> ...
Shaojin Wen has updated the pull request incrementally with two additional commits since the last revision:
- Update src/java.base/share/classes/jdk/internal/math/DoubleToDecimal.java
Co-authored-by: Claes Redestad <claes.redestad at oracle.com>
- Update src/java.base/share/classes/jdk/internal/math/DoubleToDecimal.java
Co-authored-by: Claes Redestad <claes.redestad at oracle.com>
-------------
Changes:
- all: https://git.openjdk.org/jdk/pull/19730/files
- new: https://git.openjdk.org/jdk/pull/19730/files/5a432c9e..fac64f63
Webrevs:
- full: https://webrevs.openjdk.org/?repo=jdk&pr=19730&range=08
- incr: https://webrevs.openjdk.org/?repo=jdk&pr=19730&range=07-08
Stats: 4 lines in 1 file changed: 1 ins; 2 del; 1 mod
Patch: https://git.openjdk.org/jdk/pull/19730.diff
Fetch: git fetch https://git.openjdk.org/jdk.git pull/19730/head:pull/19730
PR: https://git.openjdk.org/jdk/pull/19730
More information about the core-libs-dev
mailing list