> 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 one additional commit since the last revision: from @liach: use s.getBytes for performance ------------- Changes: - all: https://git.openjdk.org/jdk/pull/19730/files - new: https://git.openjdk.org/jdk/pull/19730/files/a18c1a1b..5d3405f9 Webrevs: - full: https://webrevs.openjdk.org/?repo=jdk&pr=19730&range=17 - incr: https://webrevs.openjdk.org/?repo=jdk&pr=19730&range=16-17 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