Skip to content

Commit 04bd01f

Browse files
smdmtsxerial
authored andcommitted
airframe-json: Reuse StringBuilder #381 (#546)
* json performance tuning * fix typo
1 parent 021cc9c commit 04bd01f

File tree

2 files changed

+10
-9
lines changed

2 files changed

+10
-9
lines changed

airframe-json-benchmark/src/test/scala/wvlet/airframe/json/JSONBenchmark.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ class JSONBenchmark extends AirframeSpec with Timer {
5555

5656
lazy val twitterJson = IOUtil.readAsString("airframe-json/src/test/resources/twitter.json")
5757

58-
"JSONScannerBenchmarhk" should {
58+
"JSONScannerBenchmark" should {
5959
"parse twitter.json" taggedAs ("comparison") in {
6060
bench("twitter.json", twitterJson)
6161
}

airframe-json/src/main/scala/wvlet/airframe/json/JSONScanner.scala

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ object JSONScanner {
9595
}
9696

9797
private[json] final val whiteSpaceBitVector: Array[Long] = {
98-
var b = new Array[Long](256 / 64)
98+
val b = new Array[Long](256 / 64)
9999
for (i <- 0 until 256) {
100100
import JSONToken._
101101
i match {
@@ -139,6 +139,7 @@ class JSONScanner[J](private[this] val s: JSONSource, private[this] val handler:
139139
private[this] var cursor: Int = 0
140140
private[this] var lineStartPos: Int = 0
141141
private[this] var line: Int = 0
142+
private[this] val sb = new StringBuilder()
142143

143144
import JSONScanner._
144145
import JSONToken._
@@ -187,16 +188,16 @@ class JSONScanner[J](private[this] val s: JSONSource, private[this] val handler:
187188
}
188189
}
189190

190-
final def scanObject(stack: List[JSONContext[J]]): Unit = {
191+
private final def scanObject(stack: List[JSONContext[J]]): Unit = {
191192
cursor += 1
192193
rscan(OBJECT_START, stack.head.objectContext(s, cursor - 1) :: stack)
193194
}
194-
final def scanArray(stack: List[JSONContext[J]]): Unit = {
195+
private final def scanArray(stack: List[JSONContext[J]]): Unit = {
195196
cursor += 1
196197
rscan(ARRAY_START, stack.head.arrayContext(s, cursor - 1) :: stack)
197198
}
198199

199-
final def scanAny(ctx: JSONContext[J]): J = {
200+
private final def scanAny(ctx: JSONContext[J]): J = {
200201
skipWhiteSpaces
201202
if (cursor >= s.length) {
202203
throw new UnexpectedEOF(line, cursor - lineStartPos, cursor, "Unexpected EOF")
@@ -230,7 +231,7 @@ class JSONScanner[J](private[this] val s: JSONSource, private[this] val handler:
230231

231232
@tailrec
232233
private final def rscan(state: Int, stack: List[JSONContext[J]]): Unit = {
233-
var ch = s(cursor)
234+
val ch = s(cursor)
234235
if (ch == WS_N) {
235236
cursor += 1
236237
line += 1
@@ -446,6 +447,7 @@ class JSONScanner[J](private[this] val s: JSONSource, private[this] val handler:
446447
}
447448

448449
private final def scanString(ctx: JSONContext[J]): Unit = {
450+
sb.clear()
449451
cursor += 1
450452
val stringStart = cursor
451453
val k = scanSimpleString
@@ -455,7 +457,6 @@ class JSONScanner[J](private[this] val s: JSONSource, private[this] val handler:
455457
return
456458
}
457459

458-
val sb = new StringBuilder
459460
var continue = true
460461
while (continue) {
461462
val ch = s(cursor)
@@ -496,10 +497,10 @@ class JSONScanner[J](private[this] val s: JSONSource, private[this] val handler:
496497
// }
497498
// }
498499

499-
def scanUtf8(sb: StringBuilder): Unit = {
500+
private def scanUtf8(sb: StringBuilder): Unit = {
500501
val ch = s(cursor)
501502
val first5bit = (ch & 0xF8) >> 3
502-
val isValidUtf8Header = (validUtf8BitVector & (1L << first5bit))
503+
val isValidUtf8Header = validUtf8BitVector & (1L << first5bit)
503504
if (isValidUtf8Header != 0L) {
504505
val pos = (ch & 0xF0) >> (4 - 1)
505506
val mask = 0x03L << pos

0 commit comments

Comments
 (0)