On Tue, 20 Feb 2024 16:32:54 GMT, Claes Redestad <redes...@openjdk.org> wrote:

> JDK-8282429 accidentally removed an optimization (JDK-8240094) that ensured 
> StringBuilder/StringBuffer::toString returns `""` when the builders are empty.
> 
> 
> Name                         Cnt     Base      Error   Test   Error   Unit  
> Change
> StringBuffers.emptyToString    5   12,289 ±    0,384  9,883 ± 0,721  ns/op   
> 1,24x (p = 0,000*)
>   :gc.alloc.rate                 1862,398 ±   57,647  0,007 ± 0,000 MB/sec   
> 0,00x (p = 0,000*)
>   :gc.alloc.rate.norm              24,000 ±    0,000  0,000 ± 0,000   B/op   
> 0,00x (p = 0,000*)
>   :gc.count                        31,000             0,000         counts
>   :gc.time                         21,000                               ms
> StringBuilders.emptyToString   5    4,146 ±    0,567  0,646 ± 0,003  ns/op   
> 6,42x (p = 0,000*)
>   :gc.alloc.rate                 9208,656 ± 1234,399  0,007 ± 0,000 MB/sec   
> 0,00x (p = 0,000*)
>   :gc.alloc.rate.norm              40,000 ±    0,000  0,000 ± 0,000   B/op   
> 0,00x (p = 0,000*)
>   :gc.count                        96,000             0,000         counts
>   :gc.time                         64,000                               ms
>   * = significant

OK, so before [JDK-8282429](https://bugs.openjdk.org/browse/JDK-8282429) this 
was handled by `String{Latin1|UTF16}.newString`, gotcha.

src/java.base/share/classes/java/lang/StringBuilder.java line 478:

> 476:         }
> 477:         // Create a copy, don't share the array
> 478:         return new String(this, null);

Ok, this got me a bit confused, but I think this just inlines the call to this 
constructor:


    public String(StringBuilder builder) {
        this(builder, null);
    }

test/micro/org/openjdk/bench/java/lang/StringBuffers.java line 49:

> 47: 
> 48:     @Benchmark
> 49:     public String emptyToString() {

Do we actually need to remove the `substring` test here?

test/micro/org/openjdk/bench/java/lang/StringBuilderToString.java line 33:

> 31: import org.openjdk.jmh.annotations.Param;
> 32: import org.openjdk.jmh.annotations.Scope;
> 33: import org.openjdk.jmh.annotations.Setup;

Is this needed?

test/micro/org/openjdk/bench/java/lang/StringBuilders.java line 407:

> 405: 
> 406:         private void generateData() {
> 407:             sb = new StringBuilder(length);

This looks weird, given there is a `sb` initialization two lines below. Is this 
`sbEmpty`, really?

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

PR Review: https://git.openjdk.org/jdk/pull/17931#pullrequestreview-1890982087
PR Review Comment: https://git.openjdk.org/jdk/pull/17931#discussion_r1496181978
PR Review Comment: https://git.openjdk.org/jdk/pull/17931#discussion_r1496178639
PR Review Comment: https://git.openjdk.org/jdk/pull/17931#discussion_r1496177666
PR Review Comment: https://git.openjdk.org/jdk/pull/17931#discussion_r1496182725

Reply via email to