RFR: 8315585: Optimization for decimal to string [v7]

Shaojin Wen duke at openjdk.org
Wed Oct 18 14:40:02 UTC 2023


On Mon, 16 Oct 2023 15:00:42 GMT, Shaojin Wen <duke at openjdk.org> wrote:

>> I submitted PR #15555 before, and there were too many changes. I split it into multiple PRs with small changes. This one is one of them.
>> 
>> this PR removed the duplicate code for getChars in BigDecimal#StringBuilderHelper, i also make performance faster.
>> Please review and don't hesitate to critique my approach and patch.
>
> Shaojin Wen has updated the pull request incrementally with one additional commit since the last revision:
> 
>   Use StringConcatFactory.makeConcatWithConstants

After adding patch #16244, I ran it many times without the occasional slowdown.  

adding patch branch : https://github.com/wenshao/jdk/tree/optim_decimal_to_string_x1_mcwc_3 

Can we go one step further and add some prepend methods for char type prefix? Like this:


public final class StringConcatFactory {
    private static MethodHandle prepender(String prefix, Class<?> cl) {
        if (prefix == null || prefix.isEmpty()) {
            return noConstantPrepender(cl);
        } else {
            if (prefix.length() == 1
                    && (cl == boolean.class
                    || cl == char.class
                    || cl == int.class
                    || cl == long.class
                    || cl == String.class)
            ) {
                char ch = prefix.charAt(0);
                MethodHandle prepend = JLA.stringConcatHelper(
                        "prepend",
                        methodType(long.class, long.class, byte[].class, cl, char.class)).rebind();
                return MethodHandles.insertArguments(prepend, 3, ch);
            }
            return MethodHandles.insertArguments(
                    prepender(cl), 3, prefix);
        }
    }
}

class StringConcatHelper {
    private static long prepend(long indexCoder, byte[] buf, char value, char prefix) {
        if (indexCoder < UTF16) {
            buf[(int)(--indexCoder)] = (byte) (value & 0xFF);
            buf[(int)(--indexCoder)] = (byte) (prefix & 0xFF);
        } else {
            StringUTF16.putChar(buf, (int)(--indexCoder), value);
            StringUTF16.putChar(buf, (int)(--indexCoder), prefix);
        }
        return indexCoder;
    }
}

-------------

PR Comment: https://git.openjdk.org/jdk/pull/16006#issuecomment-1768608568


More information about the core-libs-dev mailing list