[PATCH] unnecessary null check inside of java.lang.Boolean.valueOf(String)

Martin Buchholz martinrb at google.com
Thu Mar 22 20:26:25 UTC 2018


Сергей: Thanks for the benchmarking.
I would always do benchmarking with latest available jdk, i.e. jdk11.
You don't say which variant is better and which is best!
But the difference is small enough we should go with the simpler one you
originally suggested

return "true".equalsIgnoreCase(s);

I suspect hotspot uses the fact that the receiver is a constant.

On Thu, Mar 22, 2018 at 1:02 PM, Сергей Цыпанов <sergei.tsypanov at yandex.ru>
wrote:

> I've measured performance of suggested code comparing with previous
> variants (5 forks, 5 warmup and 10 measurement iterations, 1 s each).
> Here's the output for JDK 9.0.4:
>
> Benchmark                                (str)  Mode  Cnt  Score   Error
> Thanks for the benchmarking.
> I would always do benchmarking with latest available jdk, i.e. jdk11.
> You don't say which variant is better and which is best!
> But the difference is small enough we should go with the simpler one you
> originally suggested
>
> eturn "true".equalsIgnoreCase(s);
>
> On Thu, Mar 22, 2018 at 1:02 PM, Сергей Цыпанов <sergei.tsypanov at yandex.ru>
> wrote:
> I've measured performance of suggested code comparing with previous
> variants (5 forks, 5 warmup and 10 measurement iterations, 1 s each).
> Here's the output for JDK 9.0.4:
>
> Benchmark                                (str)  Mode  Cnt  Score   Error
> Units
> EqualsIgnoreCaseBenchmark.bestMethod      true  avgt   50  5,552 ± 0,070
> ns/op
> EqualsIgnoreCaseBenchmark.bestMethod     false  avgt   50  2,703 ± 0,054
> ns/op
> EqualsIgnoreCaseBenchmark.bestMethod      null  avgt   50  2,248 ± 0,076
> ns/op
>
> EqualsIgnoreCaseBenchmark.betterMethod    true  avgt   50  5,072 ± 0,626
> ns/op
> EqualsIgnoreCaseBenchmark.betterMethod   false  avgt   50  2,955 ± 0,072
> ns/op
> EqualsIgnoreCaseBenchmark.betterMethod    null  avgt   50  2,416 ± 0,040
> ns/op
>
> EqualsIgnoreCaseBenchmark.defaultMethod   true  avgt   50  8,986 ± 0,159
> ns/op
> EqualsIgnoreCaseBenchmark.defaultMethod  false  avgt   50  2,912 ± 0,162
> ns/op
> EqualsIgnoreCaseBenchmark.defaultMethod   null  avgt   50  2,186 ± 0,027
> ns/op
>
> and for JDK 10
>
> Benchmark                                (str)  Mode  Cnt  Score   Error
> Units
> EqualsIgnoreCaseBenchmark.bestMethod      true  avgt   50  5,672 ± 0,071
> ns/op
> EqualsIgnoreCaseBenchmark.bestMethod     false  avgt   50  3,120 ± 0,040
> ns/op
> EqualsIgnoreCaseBenchmark.bestMethod      null  avgt   50  2,705 ± 0,060
> ns/op
>
> EqualsIgnoreCaseBenchmark.betterMethod    true  avgt   50  5,141 ± 0,080
> ns/op
> EqualsIgnoreCaseBenchmark.betterMethod   false  avgt   50  3,436 ± 0,049
> ns/op
> EqualsIgnoreCaseBenchmark.betterMethod    null  avgt   50  3,085 ± 0,048
> ns/op
>
> EqualsIgnoreCaseBenchmark.defaultMethod   true  avgt   50  9,931 ± 0,257
> ns/op
> EqualsIgnoreCaseBenchmark.defaultMethod  false  avgt   50  3,367 ± 0,003
> ns/op
> EqualsIgnoreCaseBenchmark.defaultMethod   null  avgt   50  2,631 ± 0,002
> ns/op
>
> 22.03.2018, 19:35, "Martin Buchholz" <martinrb at google.com>:
> If parseBoolean is worth optimizing (barely, but only because Boolean is
> very popular), then let's do the usual ASCII bit-twiddling:
>
>     public static boolean parseBoolean(String s) {
>         // return "true".equalsIgnoreCase(s);
>         return s != null
>             && s.length() == 4
>             && (s.charAt(0) | 0x20) == 't'
>             && (s.charAt(1) | 0x20) == 'r'
>             && (s.charAt(2) | 0x20) == 'u'
>             && (s.charAt(3) | 0x20) == 'e';
>     }
>
> ModuleBootstrap is not worth changing because any system property is very
> unlikely to be set - the null check will trip 99.9999% of the time.
>
> Units
> EqualsIgnoreCaseBenchmark.bestMethod      true  avgt   50  5,552 ± 0,070
>  ns/op
> EqualsIgnoreCaseBenchmark.bestMethod     false  avgt   50  2,703 ± 0,054
>  ns/op
> EqualsIgnoreCaseBenchmark.bestMethod      null  avgt   50  2,248 ± 0,076
>  ns/op
>
> EqualsIgnoreCaseBenchmark.betterMethod    true  avgt   50  5,072 ± 0,626
>  ns/op
> EqualsIgnoreCaseBenchmark.betterMethod   false  avgt   50  2,955 ± 0,072
>  ns/op
> EqualsIgnoreCaseBenchmark.betterMethod    null  avgt   50  2,416 ± 0,040
>  ns/op
>
> EqualsIgnoreCaseBenchmark.defaultMethod   true  avgt   50  8,986 ± 0,159
>  ns/op
> EqualsIgnoreCaseBenchmark.defaultMethod  false  avgt   50  2,912 ± 0,162
>  ns/op
> EqualsIgnoreCaseBenchmark.defaultMethod   null  avgt   50  2,186 ± 0,027
>  ns/op
>
> and for JDK 10
>
> Benchmark                                (str)  Mode  Cnt  Score   Error
>  Units
> EqualsIgnoreCaseBenchmark.bestMethod      true  avgt   50  5,672 ± 0,071
>  ns/op
> EqualsIgnoreCaseBenchmark.bestMethod     false  avgt   50  3,120 ± 0,040
>  ns/op
> EqualsIgnoreCaseBenchmark.bestMethod      null  avgt   50  2,705 ± 0,060
>  ns/op
>
> EqualsIgnoreCaseBenchmark.betterMethod    true  avgt   50  5,141 ± 0,080
>  ns/op
> EqualsIgnoreCaseBenchmark.betterMethod   false  avgt   50  3,436 ± 0,049
>  ns/op
> EqualsIgnoreCaseBenchmark.betterMethod    null  avgt   50  3,085 ± 0,048
>  ns/op
>
> EqualsIgnoreCaseBenchmark.defaultMethod   true  avgt   50  9,931 ± 0,257
>  ns/op
> EqualsIgnoreCaseBenchmark.defaultMethod  false  avgt   50  3,367 ± 0,003
>  ns/op
> EqualsIgnoreCaseBenchmark.defaultMethod   null  avgt   50  2,631 ± 0,002
>  ns/op
>
> 22.03.2018, 19:35, "Martin Buchholz" <martinrb at google.com>:
>
> If parseBoolean is worth optimizing (barely, but only because Boolean is
> very popular), then let's do the usual ASCII bit-twiddling:
>
>     public static boolean parseBoolean(String s) {
>         // return "true".equalsIgnoreCase(s);
>         return s != null
>             && s.length() == 4
>             && (s.charAt(0) | 0x20) == 't'
>             && (s.charAt(1) | 0x20) == 'r'
>             && (s.charAt(2) | 0x20) == 'u'
>             && (s.charAt(3) | 0x20) == 'e';
>     }
>
> ModuleBootstrap is not worth changing because any system property is very
> unlikely to be set - the null check will trip 99.9999% of the time.
>
>
>


More information about the core-libs-dev mailing list