optimized tmp buffer for IndexedSeq
Avoid resizing and potentially copying the tmp buffer for IndexedSeqs larger than the tmp buffer
This commit is contained in:
parent
1313fb736d
commit
8aa610a2aa
1 changed files with 10 additions and 1 deletions
|
|
@ -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)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue