JDK-8189375 <https://bugs.openjdk.java.net/browse/JDK-8189375> should be closed as duplicate.
On Thu, 26 Mar 2020 at 18:06, Claes Redestad <claes.redes...@oracle.com> wrote: > Filed and pushed: https://bugs.openjdk.java.net/browse/JDK-8241649 > > /Claes > > On 2020-03-26 00:12, Roger Riggs wrote: > > Agreed, +1 > > > > On 3/25/20 5:53 PM, Claes Redestad wrote: > >> Looks good and trivial, including the drive-by cleanups. > >> > >> I can sponsor. > >> > >> /Claes > >> > >> On 2020-03-25 22:18, Сергей Цыпанов wrote: > >>> Hello, > >>> > >>> I think we can reduce allocation rate for j.l.Character.toString() by > >>> calling String.valueOf(char) instead of String.valueOf(char[]). > >>> > >>> Current implementation creates char[] with one char which is later > >>> decoded into byte[]. > >>> > >>> Instead String.valueOf(char) decodes char directly consuming less > >>> memory. I've used benchmark [1] > >>> and on my machine got those results (JDK 14): > >>> > >>> Benchmark Mode Score Error Units > >>> > >>> CharacterToStringBenchmark.toString_utf8 avgt 14.723 ± 1.354 > ns/op > >>> CharacterToStringBenchmark.valueOf_utf8 avgt 7.678 ± 0.601 ns/op > >>> > >>> CharacterToStringBenchmark.toString_latin avgt 10.992 ± 1.371 ns/op > >>> CharacterToStringBenchmark.valueOf_latin avgt 7.844 ± 1.044 > ns/op > >>> > >>> CharacterToStringBenchmark.toString_utf8:·gc.alloc.rate.norm avgt > >>> 96.003 ± 0.001 B/op > >>> CharacterToStringBenchmark.valueOf_utf8:·gc.alloc.rate.norm avgt > >>> 48.002 ± 0.001 B/op > >>> > >>> CharacterToStringBenchmark.toString_latin:·gc.alloc.rate.norm avgt > >>> 72.003 ± 0.001 B/op > >>> CharacterToStringBenchmark.valueOf_latin:·gc.alloc.rate.norm avgt > >>> 48.002 ± 0.001 B/op > >>> > >>> > >>> Patch is below. > >>> > >>> With best regards, > >>> Sergey Tsypanov > >>> > >>> [1] > >>> > https://github.com/stsypanov/strings/blob/master/src/jmh/java/tsypanov/strings/character/CharacterToStringBenchmark.java > >>> > >>> > >>> diff --git a/src/java.base/share/classes/java/lang/Character.java > >>> b/src/java.base/share/classes/java/lang/Character.java > >>> --- a/src/java.base/share/classes/java/lang/Character.java > >>> +++ b/src/java.base/share/classes/java/lang/Character.java > >>> @@ -3285,7 +3285,7 @@ > >>> "SYMBOLS AND PICTOGRAPHS EXTENDED-A", > >>> "SYMBOLSANDPICTOGRAPHSEXTENDED-A"); > >>> - private static final int blockStarts[] = { > >>> + private static final int[] blockStarts = { > >>> 0x0000, // 0000..007F; Basic Latin > >>> 0x0080, // 0080..00FF; Latin-1 Supplement > >>> 0x0100, // 0100..017F; Latin Extended-A > >>> @@ -8068,7 +8068,7 @@ > >>> UNKNOWN, // E01F0..10FFFF > >>> }; > >>> - private static HashMap<String, Character.UnicodeScript> > >>> aliases; > >>> + private static final HashMap<String, > >>> Character.UnicodeScript> aliases; > >>> static { > >>> aliases = new HashMap<>((int)(153 / 0.75f + 1.0f)); > >>> aliases.put("ADLM", ADLAM); > >>> @@ -8421,8 +8421,7 @@ > >>> * @return a string representation of this object. > >>> */ > >>> public String toString() { > >>> - char buf[] = {value}; > >>> - return String.valueOf(buf); > >>> + return toString(value); > >>> } > >>> /** > >>> > > > -- Anirvan