RFR 8189230: JDK method:java.lang.Integer.numberOfLeadingZeros(int) can be optimized
Paul Sandoz
paul.sandoz at oracle.com
Tue Mar 13 23:42:37 UTC 2018
Given how trivial the changes are it looks ok, but not sure it really matters in practice.
—
Note that it’s possible to selectively disable intrinsics. For future reference, when you want to avoid copying code if you happen to benchmark intrinsics in the future:
-XX:+UnlockDiagnosticVMOptions -XX:DisableIntrinsic=_numberOfLeadingZeros_i
But you have to know the intrinsic name, you can find ‘em here:
http://hg.openjdk.java.net/jdk/jdk/file/63eceefeb347/src/hotspot/share/classfile/vmSymbols.hpp#l805
Paul.
> On Mar 13, 2018, at 4:14 PM, Brian Burkhalter <brian.burkhalter at oracle.com> wrote:
>
> https://bugs.openjdk.java.net/browse/JDK-8189230
>
> The change included below improves the performance of {Integer,Long}.numberOfLeadingZeros primarily for negative parameters by 20% to 33% as measured by JMH benchmarks. For details please refer to the bug report. Although on certain platforms there could be an intrinsic for the methods in question, given the simplicity of the change it seems worth making.
>
> Thanks,
>
> Brian
>
> --- a/src/java.base/share/classes/java/lang/Integer.java
> +++ b/src/java.base/share/classes/java/lang/Integer.java
> @@ -1625,8 +1625,8 @@
> @HotSpotIntrinsicCandidate
> public static int numberOfLeadingZeros(int i) {
> // HD, Figure 5-6
> - if (i == 0)
> - return 32;
> + if (i <= 0)
> + return i == 0 ? 32 : 0;
> int n = 1;
> if (i >>> 16 == 0) { n += 16; i <<= 16; }
> if (i >>> 24 == 0) { n += 8; i <<= 8; }
>
> --- a/src/java.base/share/classes/java/lang/Long.java
> +++ b/src/java.base/share/classes/java/lang/Long.java
> @@ -1,5 +1,5 @@
> /*
> - * Copyright (c) 1994, 2017, Oracle and/or its affiliates. All rights reserved.
> + * Copyright (c) 1994, 2018, Oracle and/or its affiliates. All rights reserved.
> * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
> *
> * This code is free software; you can redistribute it and/or modify it
> @@ -1771,8 +1771,8 @@
> @HotSpotIntrinsicCandidate
> public static int numberOfLeadingZeros(long i) {
> // HD, Figure 5-6
> - if (i == 0)
> - return 64;
> + if (i <= 0)
> + return i == 0 ? 64 : 0;
> int n = 1;
> int x = (int)(i >>> 32);
> if (x == 0) { n += 32; x = (int)i; }
>
More information about the core-libs-dev
mailing list