Skip to content

Commit 39bf5d5

Browse files
committed
More efficient serialization of Double values using Scala.js
1 parent 28c3116 commit 39bf5d5

File tree

2 files changed

+22
-11
lines changed

2 files changed

+22
-11
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3908,7 +3908,7 @@ final class JsonReader private[jsoniter_scala](
39083908
var j = i
39093909
val dl = d.toInt
39103910
if (dl != d) {
3911-
val dh = (d >> 32).toInt
3911+
val dh = (d >>> 32).toInt
39123912
var shift = 32 - java.lang.Integer.numberOfLeadingZeros(dh) & 0x1C
39133913
while (shift >= 0) {
39143914
charBuf(j) = ds(dh >> shift & 0xF)

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

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1617,7 +1617,7 @@ final class JsonWriter private[jsoniter_scala](
16171617
pos += digitCount(q)
16181618
count = pos
16191619
} else {
1620-
val q1 = (exp >> 8) * 1441151881 >> 49 // divide a small positive long by 100000000
1620+
val q1 = (exp >>> 8) * 1441151881 >>> 49 // divide a small positive long by 100000000
16211621
q = q1.toInt
16221622
pos += digitCount(q)
16231623
count = write8Digits((exp - q1 * 100000000).toInt, pos, buf, ds)
@@ -2209,7 +2209,7 @@ final class JsonWriter private[jsoniter_scala](
22092209
private[this] def write18Digits(x: Long, pos: Int, buf: Array[Byte], ds: Array[Short]): Int = {
22102210
val q1 = x / 100000000
22112211
write8Digits((x - q1 * 100000000).toInt, {
2212-
val q2 = (q1 >> 8) * 1441151881 >> 49 // divide a small positive long by 100000000
2212+
val q2 = (q1 >>> 8) * 1441151881 >>> 49 // divide a small positive long by 100000000
22132213
write8Digits((q1 - q2 * 100000000).toInt, write2Digits(q2.toInt, pos, buf, ds), buf, ds)
22142214
}, buf, ds)
22152215
}
@@ -2291,7 +2291,7 @@ final class JsonWriter private[jsoniter_scala](
22912291
lastPos += digitCount(q)
22922292
pos = lastPos
22932293
} else {
2294-
val q2 = (q1 >> 8) * 1441151881 >> 49 // divide a small positive long by 100000000
2294+
val q2 = (q1 >>> 8) * 1441151881 >>> 49 // divide a small positive long by 100000000
22952295
q = q2.toInt
22962296
lastPos += digitCount(q)
22972297
pos = write8Digits((q1 - q2 * 100000000).toInt, lastPos, buf, ds)
@@ -2434,12 +2434,12 @@ final class JsonWriter private[jsoniter_scala](
24342434
pos += 3
24352435
} else {
24362436
val bits = java.lang.Double.doubleToLongBits(x)
2437-
var e2 = ((bits >> 52).toInt & 0x7FF) - 1075
2437+
var e2 = ((bits >>> 52).toInt & 0x7FF) - 1075
24382438
var m2 = bits & 0xFFFFFFFFFFFFFL | 0x10000000000000L
24392439
var m10 = 0L
24402440
var e10 = 0
24412441
if (e2 == 0) m10 = m2
2442-
else if ((e2 >= -52 && e2 < 0) && m2 << e2 == 0) m10 = m2 >> -e2
2442+
else if ((e2 >= -52 && e2 < 0) && m2 << e2 == 0) m10 = m2 >>> -e2
24432443
else {
24442444
var e10Corr, e2Corr = 0
24452445
var cblCorr = 2
@@ -2466,15 +2466,26 @@ final class JsonWriter private[jsoniter_scala](
24662466
val vb = rop(g1, g0, cbh)
24672467
val vbl = rop(g1, g0, cbh - (cblCorr << h))
24682468
val vbr = rop(g1, g0, cbh + (2 << h))
2469+
val m10i = vb >>> 2
24692470
var diff = 0
24702471
if (vb < 400 || {
2471-
m10 = vb / 40
2472-
val vb40 = (m10 << 5) + (m10 << 3)
2472+
m10 = (vb >>> 1) + m10i // Based upon the divu10() code from Hacker's Delight 2nd Edition by Henry Warren
2473+
m10 += m10 >>> 4
2474+
m10 += m10 >>> 8
2475+
m10 += m10 >>> 16
2476+
m10 += m10 >>> 32
2477+
var vb40 = m10 & 0xFFFFFFFFFFFFFFE0L
2478+
m10 >>>= 5
2479+
vb40 += m10 << 3
24732480
diff = (vbl - vb40).toInt + vbCorr
2474-
((vb40 - vbr).toInt + vbCorr + 40 ^ diff) >= 0
2481+
((if ((vb - vb40).toInt >= 40) {
2482+
m10 += 1
2483+
diff -= 40
2484+
80
2485+
} else 40) + (vb40 - vbr).toInt + vbCorr ^ diff) >= 0
24752486
}) {
2476-
m10 = vb >> 2
2477-
val vb4 = m10 << 2
2487+
m10 = m10i
2488+
val vb4 = vb & 0xFFFFFFFFFFFFFFFCL
24782489
diff = (vbl - vb4).toInt + vbCorr
24792490
if (((vb4 - vbr).toInt + vbCorr + 4 ^ diff) >= 0) diff = (vb.toInt & 0x3) + (m10.toInt & 0x1) - 3
24802491
} else e10Corr = -1

0 commit comments

Comments
 (0)