Skip to content

Commit 3f7d288

Browse files
authored
More efficient strip of trailing zeros (#1296)
1 parent addd7ff commit 3f7d288

File tree

3 files changed

+20
-31
lines changed

3 files changed

+20
-31
lines changed

zio-json/js/src/main/scala/zio/json/internal/SafeNumbers.scala

+7-10
Original file line numberDiff line numberDiff line change
@@ -316,18 +316,18 @@ object SafeNumbers {
316316
val msb = x.getMostSignificantBits
317317
val lsb = x.getLeastSignificantBits
318318
val msb1 = (msb >> 32).toInt
319+
val msb2 = msb.toInt
320+
val lsb1 = (lsb >>> 32).toInt
321+
val lsb2 = lsb.toInt
319322
out.write(ds(msb1 >>> 24), ds(msb1 >> 16 & 0xff), ds(msb1 >> 8 & 0xff), ds(msb1 & 0xff))
320323
out.write('-')
321-
val msb2 = msb.toInt
322324
out.write(ds(msb2 >>> 24), ds(msb2 >> 16 & 0xff))
323325
out.write('-')
324326
out.write(ds(msb2 >> 8 & 0xff), ds(msb2 & 0xff))
325327
out.write('-')
326-
val lsb1 = (lsb >>> 32).toInt
327328
out.write(ds(lsb1 >>> 24), ds(lsb1 >> 16 & 0xff))
328329
out.write('-')
329330
out.write(ds(lsb1 >> 8 & 0xff), ds(lsb1 & 0xff))
330-
val lsb2 = lsb.toInt
331331
out.write(ds(lsb2 >>> 24), ds(lsb2 >> 16 & 0xff), ds(lsb2 >> 8 & 0xff), ds(lsb2 & 0xff))
332332
}
333333

@@ -406,14 +406,11 @@ object SafeNumbers {
406406
}
407407

408408
@inline private[this] def stripTrailingZeros(x: Int): Int = {
409-
var q0 = x
410-
var q1 = 0
409+
var q0, q1 = x
411410
while ({
412-
q1 = q0 / 100
413-
q1 * 100 == q0 // check if q is divisible by 100
411+
q1 /= 10
412+
q1 * 10 == q0 // check if q is divisible by 100
414413
}) q0 = q1
415-
q1 = q0 / 10
416-
if (q1 * 10 == q0) return q1 // check if q is divisible by 10
417414
q0
418415
}
419416

@@ -577,7 +574,7 @@ object SafeNumbers {
577574
else 10
578575
}
579576

580-
private final val lowerCaseHexDigits: Array[Short] = Array(
577+
private[this] final val lowerCaseHexDigits: Array[Short] = Array(
581578
12336, 12592, 12848, 13104, 13360, 13616, 13872, 14128, 14384, 14640, 24880, 25136, 25392, 25648, 25904, 26160,
582579
12337, 12593, 12849, 13105, 13361, 13617, 13873, 14129, 14385, 14641, 24881, 25137, 25393, 25649, 25905, 26161,
583580
12338, 12594, 12850, 13106, 13362, 13618, 13874, 14130, 14386, 14642, 24882, 25138, 25394, 25650, 25906, 26162,

zio-json/jvm/src/main/scala/zio/json/internal/SafeNumbers.scala

+8-12
Original file line numberDiff line numberDiff line change
@@ -307,18 +307,18 @@ object SafeNumbers {
307307
val msb = x.getMostSignificantBits
308308
val lsb = x.getLeastSignificantBits
309309
val msb1 = (msb >> 32).toInt
310+
val msb2 = msb.toInt
311+
val lsb1 = (lsb >>> 32).toInt
312+
val lsb2 = lsb.toInt
310313
out.write(ds(msb1 >>> 24), ds(msb1 >> 16 & 0xff), ds(msb1 >> 8 & 0xff), ds(msb1 & 0xff))
311314
out.write('-')
312-
val msb2 = msb.toInt
313315
out.write(ds(msb2 >>> 24), ds(msb2 >> 16 & 0xff))
314316
out.write('-')
315317
out.write(ds(msb2 >> 8 & 0xff), ds(msb2 & 0xff))
316318
out.write('-')
317-
val lsb1 = (lsb >>> 32).toInt
318319
out.write(ds(lsb1 >>> 24), ds(lsb1 >> 16 & 0xff))
319320
out.write('-')
320321
out.write(ds(lsb1 >> 8 & 0xff), ds(lsb1 & 0xff))
321-
val lsb2 = lsb.toInt
322322
out.write(ds(lsb2 >>> 24), ds(lsb2 >> 16 & 0xff), ds(lsb2 >> 8 & 0xff), ds(lsb2 & 0xff))
323323
}
324324

@@ -369,16 +369,12 @@ object SafeNumbers {
369369
}
370370

371371
private[this] def stripTrailingZeros(x: Int): Int = {
372-
var q0 = x
373-
var q1 = 0
372+
var q0, q1 = x
374373
while ({
375-
val qp = q0 * 1374389535L
376-
q1 = (qp >> 37).toInt // divide a positive int by 100
377-
(qp & 0x1fc0000000L) == 0 // check if q is divisible by 100
374+
val qp = q1 * 3435973837L
375+
q1 = (qp >> 35).toInt // divide a positive int by 10
376+
(qp & 0x7e0000000L) == 0 // check if q is divisible by 10
378377
}) q0 = q1
379-
val qp = q0 * 3435973837L
380-
q1 = (qp >> 35).toInt // divide a positive int by 10
381-
if ((qp & 0x7e0000000L) == 0) return q1 // check if q is divisible by 10
382378
q0
383379
}
384380

@@ -510,7 +506,7 @@ object SafeNumbers {
510506
576460752303423478L, 576460752303423478L, 576460752303423478L, 576460752303423478L, 576460752303423478L
511507
)
512508

513-
private final val lowerCaseHexDigits: Array[Short] = Array(
509+
private[this] final val lowerCaseHexDigits: Array[Short] = Array(
514510
12336, 12592, 12848, 13104, 13360, 13616, 13872, 14128, 14384, 14640, 24880, 25136, 25392, 25648, 25904, 26160,
515511
12337, 12593, 12849, 13105, 13361, 13617, 13873, 14129, 14385, 14641, 24881, 25137, 25393, 25649, 25905, 26161,
516512
12338, 12594, 12850, 13106, 13362, 13618, 13874, 14130, 14386, 14642, 24882, 25138, 25394, 25650, 25906, 26162,

zio-json/native/src/main/scala/zio/json/internal/SafeNumbers.scala

+5-9
Original file line numberDiff line numberDiff line change
@@ -369,16 +369,12 @@ object SafeNumbers {
369369
}
370370

371371
private[this] def stripTrailingZeros(x: Int): Int = {
372-
var q0 = x
373-
var q1 = 0
372+
var q0, q1 = x
374373
while ({
375-
val qp = q0 * 1374389535L
376-
q1 = (qp >> 37).toInt // divide a positive int by 100
377-
(qp & 0x1fc0000000L) == 0 // check if q is divisible by 100
374+
val qp = q1 * 3435973837L
375+
q1 = (qp >> 35).toInt // divide a positive int by 10
376+
(qp & 0x7e0000000L) == 0 // check if q is divisible by 10
378377
}) q0 = q1
379-
val qp = q0 * 3435973837L
380-
q1 = (qp >> 35).toInt // divide a positive int by 10
381-
if ((qp & 0x7e0000000L) == 0) return q1 // check if q is divisible by 10
382378
q0
383379
}
384380

@@ -510,7 +506,7 @@ object SafeNumbers {
510506
576460752303423478L, 576460752303423478L, 576460752303423478L, 576460752303423478L, 576460752303423478L
511507
)
512508

513-
private final val lowerCaseHexDigits: Array[Short] = Array(
509+
private[this] final val lowerCaseHexDigits: Array[Short] = Array(
514510
12336, 12592, 12848, 13104, 13360, 13616, 13872, 14128, 14384, 14640, 24880, 25136, 25392, 25648, 25904, 26160,
515511
12337, 12593, 12849, 13105, 13361, 13617, 13873, 14129, 14385, 14641, 24881, 25137, 25393, 25649, 25905, 26161,
516512
12338, 12594, 12850, 13106, 13362, 13618, 13874, 14130, 14386, 14642, 24882, 25138, 25394, 25650, 25906, 26162,

0 commit comments

Comments
 (0)