8183912: java.math.BigDecimal.movePointLeft() should return this if called with zero argument

Roger Riggs Roger.Riggs at oracle.com
Tue Dec 18 18:55:33 UTC 2018


+1,

Hard to argue with +10x.  :)

Roger

On 12/18/2018 01:03 PM, Brian Burkhalter wrote:
> https://bugs.openjdk.java.net/browse/JDK-8183912 <https://bugs.openjdk.java.net/browse/JDK-8183912>
>
> For the patch included below, the JMH benchmark MovePointLeftZero attached to the above issue, when run with options "-f 1 -wi 5 -w 5 -i 10 -r 10" (one fork, five warmup iterations of five seconds each, ten measurement iterations of ten seconds each), shows an order of magnitude (10X) throughput improvement for a zero left shift. The effect on the positive left shift case appears to be at the level of measurement noise.
>
> Thanks,
>
> Brian
>
> --- a/src/java.base/share/classes/java/math/BigDecimal.java
> +++ b/src/java.base/share/classes/java/math/BigDecimal.java
> @@ -2871,6 +2871,8 @@
>        * @throws ArithmeticException if scale overflows.
>        */
>       public BigDecimal movePointLeft(int n) {
> +        if (n == 0) return this;
> +
>           // Cannot use movePointRight(-n) in case of n==Integer.MIN_VALUE
>           int newScale = checkScale((long)scale + n);
>           BigDecimal num = new BigDecimal(intVal, intCompact, newScale, 0);
> @@ -2893,6 +2895,8 @@
>        * @throws ArithmeticException if scale overflows.
>        */
>       public BigDecimal movePointRight(int n) {
> +        if (n == 0) return this;
> +
>           // Cannot use movePointLeft(-n) in case of n==Integer.MIN_VALUE
>           int newScale = checkScale((long)scale - n);
>           BigDecimal num = new BigDecimal(intVal, intCompact, newScale, 0);
>



More information about the core-libs-dev mailing list