From 8aa610a2aae674b009bed67cf88f70888e746202 Mon Sep 17 00:00:00 2001 From: Colin Godsey Date: Tue, 24 Mar 2015 16:53:10 -0500 Subject: [PATCH] optimized tmp buffer for IndexedSeq Avoid resizing and potentially copying the tmp buffer for IndexedSeqs larger than the tmp buffer --- akka-actor/src/main/scala/akka/util/ByteString.scala | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/akka-actor/src/main/scala/akka/util/ByteString.scala b/akka-actor/src/main/scala/akka/util/ByteString.scala index 9e72959db9..92650d3040 100644 --- a/akka-actor/src/main/scala/akka/util/ByteString.scala +++ b/akka-actor/src/main/scala/akka/util/ByteString.scala @@ -544,8 +544,10 @@ final class ByteStringBuilder extends Builder[Byte, ByteString] { _tempCapacity = _temp.length } + @inline private def shouldResizeTempFor(size: Int): Boolean = _tempCapacity < size || _tempCapacity == 0 + private def ensureTempSize(size: Int): Unit = { - if (_tempCapacity < size || _tempCapacity == 0) { + if (shouldResizeTempFor(size)) { var newSize = if (_tempCapacity == 0) 16 else _tempCapacity * 2 while (newSize < size) newSize *= 2 resizeTemp(newSize) @@ -576,6 +578,13 @@ final class ByteStringBuilder extends Builder[Byte, ByteString] { _length += bs.length case xs: WrappedArray.ofByte ⇒ putByteArrayUnsafe(xs.array.clone) + case seq: collection.IndexedSeq[Byte] if shouldResizeTempFor(seq.length) ⇒ + val copied = new Array[Byte](seq.length) + seq.copyToArray(copied) + + clearTemp() + _builder += ByteString.ByteString1(copied) + _length += seq.length case seq: collection.IndexedSeq[_] ⇒ ensureTempSize(_tempLength + xs.size) xs.copyToArray(_temp, _tempLength)