Skip to content

Commit 96f708e

Browse files
committed
More efficient reading of BigInt and BigDecimal values with 37+ digit mantissa
1 parent a26bdcc commit 96f708e

File tree

3 files changed

+23
-12
lines changed
  • jsoniter-scala-core

3 files changed

+23
-12
lines changed

jsoniter-scala-core/js/src/main/scala/com/github/plokhotnyuk/jsoniter_scala/core/JsonReader.scala

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2802,11 +2802,13 @@ final class JsonReader private[jsoniter_scala](
28022802
pos += 9
28032803
first = Math.max(first - 1, 0)
28042804
var i = last
2805-
while (i >= first) {
2805+
while ({
28062806
x += (magnitude(i) & 0xFFFFFFFFL) * 1000000000
28072807
magnitude(i) = x.toInt
2808-
x >>>= 32
28092808
i -= 1
2809+
i >= first
2810+
}) {
2811+
x >>>= 32
28102812
}
28112813
}
28122814
val bs = new Array[Byte](last + 1 << 2)

jsoniter-scala-core/jvm/src/main/scala/com/github/plokhotnyuk/jsoniter_scala/core/JsonReader.scala

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2847,13 +2847,18 @@ final class JsonReader private[jsoniter_scala](
28472847
first = Math.max(first - 8, 0)
28482848
var i = last
28492849
val q = 1000000000000000000L
2850-
while (i >= first) {
2851-
val m = ByteArrayAccess.getLong(magnitude, i)
2852-
val p = m * q
2853-
x += p
2850+
var m, mq = 0L
2851+
while ({
2852+
m = ByteArrayAccess.getLong(magnitude, i)
2853+
mq = m * q
2854+
x += mq
28542855
ByteArrayAccess.setLong(magnitude, i, x)
2855-
x = Math.multiplyHigh(m, q) + (m >> 63 & q) + ((~x & p) >>> 63) // FIXME: Use Math.unsignedMultiplyHigh after dropping of JDK 17 support
28562856
i -= 8
2857+
i >= first
2858+
}) {
2859+
x = (~x & mq) >>> 63
2860+
x += Math.multiplyHigh(m, q)
2861+
x += m >> 63 & q
28572862
}
28582863
}
28592864
var i = 0

jsoniter-scala-core/native/src/main/scala/com/github/plokhotnyuk/jsoniter_scala/core/JsonReader.scala

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2844,13 +2844,17 @@ final class JsonReader private[jsoniter_scala](
28442844
first = Math.max(first - 8, 0)
28452845
var i = last
28462846
val q = 1000000000000000000L
2847-
while (i >= first) {
2848-
val m = ByteArrayAccess.getLong(magnitude, i)
2849-
val p = m * q
2850-
x += p
2847+
var m, mq = 0L
2848+
while ({
2849+
m = ByteArrayAccess.getLong(magnitude, i)
2850+
mq = m * q
2851+
x += mq
28512852
ByteArrayAccess.setLong(magnitude, i, x)
2852-
x = NativeMath.unsignedMultiplyHigh(m, q) + ((~x & p) >>> 63)
28532853
i -= 8
2854+
i >= first
2855+
}) {
2856+
x = (~x & mq) >>> 63
2857+
x += NativeMath.unsignedMultiplyHigh(m, q)
28542858
}
28552859
}
28562860
var i = 0

0 commit comments

Comments
 (0)