diff --git a/release-notes/VERSION-2.x b/release-notes/VERSION-2.x index 8d8cc04706..1961f3e0ad 100644 --- a/release-notes/VERSION-2.x +++ b/release-notes/VERSION-2.x @@ -51,6 +51,7 @@ JSON library. #912: Optional padding Base64Variant still throws exception on missing padding character (reported by @Vity01) +#967: Address performance issue with `BigDecimalParser` 2.14.2 (28-Jan-2023) diff --git a/src/main/java/tools/jackson/core/io/BigDecimalParser.java b/src/main/java/tools/jackson/core/io/BigDecimalParser.java index c53c2393b3..24e09ae38e 100644 --- a/src/main/java/tools/jackson/core/io/BigDecimalParser.java +++ b/src/main/java/tools/jackson/core/io/BigDecimalParser.java @@ -200,6 +200,13 @@ private static BigDecimal toBigDecimalRec(final char[] chars, final int off, fin return left.add(right); } - return len == 0 ? BigDecimal.ZERO : new BigDecimal(chars, off, len).movePointRight(scale); + if (len == 0) { + return BigDecimal.ZERO; + } + // 02-Apr-2023, tatu: [core#967] Looks like "scaleByPowerOfThen" avoids performance issue + // there would be with "movePointRight" (both doing about same thing), so) + return new BigDecimal(chars, off, len) +// .movePointRight(scale); + .scaleByPowerOfTen(scale); } } diff --git a/src/test/java/tools/jackson/failing/PerfBigDecimalParser967.java b/src/test/java/tools/jackson/failing/PerfBigDecimalParser967.java index b5951aad3e..5cb9429065 100644 --- a/src/test/java/tools/jackson/failing/PerfBigDecimalParser967.java +++ b/src/test/java/tools/jackson/failing/PerfBigDecimalParser967.java @@ -12,7 +12,7 @@ public class PerfBigDecimalParser967 private final JsonFactory JSON_F = new JsonFactory(); // For [core#967]: shouldn't take multiple seconds - @Test(timeout = 35000) + @Test(timeout = 3000) public void bigDecimalFromString() throws Exception { // Jackson's BigDecimalParser seems to be slower than JDK's; // won't fail if using latter.