RFR 8209171 : Simplify Java implementation of Integer/Long.numberOfTrailingZeros()

Ivan Gerasimov ivan.gerasimov at oracle.com
Fri Aug 10 00:27:17 UTC 2018


Hi Martin!

Thanks for taking a look!


On 8/9/18 5:13 PM, Martin Buchholz wrote:
>
>
> On Thu, Aug 9, 2018 at 4:15 PM, Ivan Gerasimov 
> <ivan.gerasimov at oracle.com <mailto:ivan.gerasimov at oracle.com>> wrote:
>
>     Hello!
>
>     Integer.numberOfTrailingZeros() and Long.numberOfTrailingZeros()
>     are intrinsified by Hotspot, so the Java implementation of these
>     is not too important.
>     However, they still can be improved by a tiny bit :)
>
>     Could you please help review the fix?
>
>     Bug: https://bugs.openjdk.java.net/browse/JDK-8209171
>     <https://bugs.openjdk.java.net/browse/JDK-8209171>
>     Webrev: http://cr.openjdk.java.net/~igerasim/8209171/00/webrev/
>     <http://cr.openjdk.java.net/%7Eigerasim/8209171/00/webrev/>
>     Benchmark for Integer:
>     http://cr.openjdk.java.net/~igerasim/8209171/00/bench/int/MyBenchmark.java
>     <http://cr.openjdk.java.net/%7Eigerasim/8209171/00/bench/int/MyBenchmark.java>
>     Benchmark for Long:
>     http://cr.openjdk.java.net/~igerasim/8209171/00/bench/long/MyBenchmark.java
>     <http://cr.openjdk.java.net/%7Eigerasim/8209171/00/bench/long/MyBenchmark.java>
>
>     The resulting code is both smaller and faster.  It may also help
>     to warm up Integer.numberOfLeadingZeros() quicker.
>
>     On average, the new Integer.numberOfTrailingZeros() has got +11%
>     to performance for -client and +1% for -server.
>     Long.numberOfTrailingZeros() is faster on 17% for -client and +20%
>     for -server.
>
>
> It seems to me the benchmark is not entirely fair to the old java 
> implementation, since the new one gets the benefit of the 
> intrinsification of  numberOfLeadingZeros.  A fairer comparison would 
> use turn off intrinsification of both.
I did not use the intrinsified variants of numberOfLeadingZeros in the 
benchmark.

In the first (Integer) benchmark I copied/pasted the Java implementation 
of both Integer.numberOfLeadingZeros and Integer.bitCount.
In the second (Long) one, Long.numberOfLeadingZeros and Long.bitCount 
were also copied into the test with their original names, and Integer 
versions of the functions were copied as Integer_numberOfLeadingZeros 
and Integer_numberOfTrailingZeros.

The later one was not the original function 
Integer.numberOfTrailingZeros, but the new one, so the numbers of the 
second benchmark reflect changes in both classes: Integer and Long.
>
> I guess benchmarking on 32-bit platforms is  no longer relevant, given 
> that they are all legacy now.
I ran them on x64 (Intel Core i7 to be precise).

-- 
With kind regards,
Ivan Gerasimov



More information about the core-libs-dev mailing list