[PATCH] Trivial improvement for j.l.Character.toString() - 8241649: Optimize Character.toString
Claes Redestad
claes.redestad at oracle.com
Mon Apr 6 10:10:50 UTC 2020
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.redestad at oracle.com
> <mailto:claes.redestad at 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
More information about the core-libs-dev
mailing list