From 2aae990acb1312da2f4a687faecab5fa2e1efbf1 Mon Sep 17 00:00:00 2001 From: Flavio Brasil Date: Thu, 29 Feb 2024 09:54:33 -0800 Subject: [PATCH] optimize uri parsing to reduce StringBuilder allocations --- core/src/main/scala/sttp/model/UriInterpolator.scala | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/core/src/main/scala/sttp/model/UriInterpolator.scala b/core/src/main/scala/sttp/model/UriInterpolator.scala index 0481e494..fc02d7af 100644 --- a/core/src/main/scala/sttp/model/UriInterpolator.scala +++ b/core/src/main/scala/sttp/model/UriInterpolator.scala @@ -731,6 +731,16 @@ object UriInterpolator { case Singleton(ExpressionToken(s: Array[_])) => b ++= s.flatMap(anyToStringOpt) doToSeq(tailTs) + case valueTs if(valueTs.size == 1) => + // This case is equivalent to the next one but optimizes for the + // frequent scenario where the sequence contains a single element. + valueTs.get(0) match { + case StringToken(s) => b += decode(s, decodePlusAsSpace) + case ExpressionToken(e) => anyToStringOpt(e).foreach(b += _) + case EqInQuery => b += "=" + case _ => + } + doToSeq(tailTs) case valueTs => val mbStr = valueTs mkStringOpt { case StringToken(s) => Some(decode(s, decodePlusAsSpace))