Good catch. Closed it as duplicate - also surprised myself that I didn't
find this one when I did a cursory search in JBS for pre-existing
issues.

/Claes

On 2020-04-06 07:24, Anirvan Sarkar wrote:
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 <mailto: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

Reply via email to