<i18n dev> RFR: 8333396: Performance regression of DecimalFormat.format [v8]

lingjun-cg duke at openjdk.org
Fri Jun 21 02:13:18 UTC 2024


On Thu, 20 Jun 2024 21:53:25 GMT, Justin Lu <jlu at openjdk.org> wrote:

> > It requires append(int), but the Appendable has no such method.
> 
> If via `Appendable` we don't have access to `append(int)`, can we simply `append(String.valueOf(int))`. And similarly for `append(char[], int, int)`, can we `append(String.valueOf(char[], int, int))`.
> 
> According to the method descriptions in `AbstractStringBuilder`, this should behaviorally be the same. That way we don't have to add any new classes, and can continue with the generic implementation.

If do that ,there is some performance degradation.

Benchmark                                                      Mode  Cnt   Score   Error  Units
AppendableTest.tesAppendableAppendCharAscii                    avgt   50  33.628 ± 0.263  ns/op
AppendableTest.tesAppendableAppendCharMixNoAsciiChars          avgt   50  33.522 ± 0.245  ns/op
AppendableTest.testAppendableAppendInt                         avgt   50  32.602 ± 0.186  ns/op
AppendableTest.testStringBufferAppendCharArrayAscii            avgt   50  31.028 ± 0.134  ns/op
AppendableTest.testStringBufferAppendCharArrayMixNoAsciiChars  avgt   50  31.075 ± 0.158  ns/op
AppendableTest.testStringBufferAppendInt                       avgt   50  25.706 ± 0.268  ns/op



@BenchmarkMode(Mode.AverageTime)
@Warmup(iterations = 5, time = 500, timeUnit = TimeUnit.MILLISECONDS)
@Measurement(iterations = 10, time = 500, timeUnit = TimeUnit.MILLISECONDS)
@State(Scope.Thread)
@OutputTimeUnit(TimeUnit.NANOSECONDS)
public class AppendableTest {

    private StringBuffer sb;
    private Appendable appendable;
    private char[] asciiChars;
    private char[] mixNoAsciiChars;

    @Setup(Level.Iteration)
    public void setup() {
        sb = new StringBuffer();
        appendable = sb;
        asciiChars = "Criticism appears to Anatole France the most recent and possibly the ultimate evolution".toCharArray();
        mixNoAsciiChars = "The 测试数据 above mentioned two volumes of poetry were followed by many works in prose, which we shall notice. France’s critical writings".toCharArray();
    }

    @Benchmark
    public void testStringBufferAppendInt() throws InterruptedException {
        sb.append(12345890);
    }

    @Benchmark
    public void testAppendableAppendInt() throws InterruptedException, IOException {
        appendable.append(String.valueOf(12345890));
    }

    @Benchmark
    public void testStringBufferAppendCharArrayAscii() throws InterruptedException {
        sb.append(asciiChars, 40, 18);
    }

    @Benchmark
    public void tesAppendableAppendCharAscii() throws InterruptedException, IOException {
        appendable.append(new String(asciiChars, 40, 18));
    }

    @Benchmark
    public void testStringBufferAppendCharArrayMixNoAsciiChars() throws InterruptedException {
        sb.append(mixNoAsciiChars, 40, 18);
    }

    @Benchmark
    public void tesAppendableAppendCharMixNoAsciiChars() throws InterruptedException, IOException {
        appendable.append(new String(mixNoAsciiChars, 40, 18));
    }
}

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

PR Comment: https://git.openjdk.org/jdk/pull/19513#issuecomment-2181851223


More information about the i18n-dev mailing list