RFR: 8334328: Reduce object allocation for FloatToDecimal and DoubleToDecimal
    Shaojin Wen 
    duke at openjdk.org
       
    Sat Jun 15 02:09:38 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);
                }
                if (app instanceof StringBuffer buffer) {
                    return buffer.append(chars);
                }
                for (char c : chars) {
                    app.append(c);
                }
                return app;
            // ...
        }
    }
}
-------------
Commit messages:
 - Reduce object allocation for FloatToDecimal and DoubleToDecimal
Changes: https://git.openjdk.org/jdk/pull/19730/files
  Webrev: https://webrevs.openjdk.org/?repo=jdk&pr=19730&range=00
  Issue: https://bugs.openjdk.org/browse/JDK-8334328
  Stats: 641 lines in 5 files changed: 293 ins; 211 del; 137 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