From e56066d16fddb84b2cae1fd24d005ac8575a3d48 Mon Sep 17 00:00:00 2001 From: Andriy Plokhotnyuk Date: Mon, 3 Feb 2025 16:26:42 +0100 Subject: [PATCH] More efficient decoding of string values (#1280) --- .../shared/src/main/scala/zio/json/internal/lexer.scala | 9 ++++++--- .../src/main/scala/zio/json/internal/writers.scala | 2 +- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/zio-json/shared/src/main/scala/zio/json/internal/lexer.scala b/zio-json/shared/src/main/scala/zio/json/internal/lexer.scala index 787220c56..8f05e281d 100644 --- a/zio-json/shared/src/main/scala/zio/json/internal/lexer.scala +++ b/zio-json/shared/src/main/scala/zio/json/internal/lexer.scala @@ -203,7 +203,8 @@ object Lexer { def string(trace: List[JsonError], in: OneCharReader): CharSequence = { var c = in.nextNonWhitespace() if (c != '"') error("'\"'", c, trace) - val sb = new FastStringBuilder(64) + var cs = new Array[Char](64) + var i = 0 while ({ c = in.readChar() c != '"' @@ -222,9 +223,11 @@ object Lexer { case _ => error(c, trace) } } else if (c < ' ') error("invalid control in string", trace) - sb.append(c) + if (i == cs.length) cs = java.util.Arrays.copyOf(cs, i << 1) + cs(i) = c + i += 1 } - sb.buffer + new String(cs, 0, i) } def char(trace: List[JsonError], in: OneCharReader): Char = { diff --git a/zio-json/shared/src/main/scala/zio/json/internal/writers.scala b/zio-json/shared/src/main/scala/zio/json/internal/writers.scala index dff590e2c..997e85530 100644 --- a/zio-json/shared/src/main/scala/zio/json/internal/writers.scala +++ b/zio-json/shared/src/main/scala/zio/json/internal/writers.scala @@ -43,7 +43,7 @@ final class FastStringWrite(initial: Int) extends Write { def buffer: CharSequence = sb } -// like StringBuilder but doesn't have any encoding or range checks +// FIXME: remove in the next major version private[zio] final class FastStringBuilder(initial: Int) { private[this] var chars: Array[Char] = new Array[Char](initial) private[this] var i: Int = 0