]> Cypherpunks repositories - gostls13.git/commit
bytes: optimize Buffer's Write, WriteString, WriteByte, and WriteRune
authorMarvin Stenger <marvin.stenger94@gmail.com>
Sun, 7 May 2017 08:43:17 +0000 (10:43 +0200)
committerBrad Fitzpatrick <bradfitz@golang.org>
Sun, 7 May 2017 17:44:46 +0000 (17:44 +0000)
commitc08ac36761d3dc03d0a0b0ffb240c4a7c524536b
treef2af53853e2c5111cf692b6090bafe0e404ae18a
parent23c5db9bbbfe2d5656b8f153e1cc7327e90d8005
bytes: optimize Buffer's Write, WriteString, WriteByte, and WriteRune

In the common case, the grow method only needs to reslice the internal
buffer. Making another function call to grow can be expensive when Write
is called very often with small pieces of data (like a byte or rune).
Thus, we add a tryGrowByReslice method that is inlineable so that we can
avoid an extra call in most cases.

name                       old time/op    new time/op    delta
WriteByte-4                  35.5µs ± 0%    17.4µs ± 1%   -51.03%  (p=0.000 n=19+20)
WriteRune-4                  55.7µs ± 1%    38.7µs ± 1%   -30.56%  (p=0.000 n=18+19)
BufferNotEmptyWriteRead-4     304µs ± 5%     283µs ± 3%    -6.86%  (p=0.000 n=19+17)
BufferFullSmallReads-4       87.0µs ± 5%    66.8µs ± 2%   -23.26%  (p=0.000 n=17+17)

name                       old speed      new speed      delta
WriteByte-4                 115MB/s ± 0%   235MB/s ± 1%  +104.19%  (p=0.000 n=19+20)
WriteRune-4                 221MB/s ± 1%   318MB/s ± 1%   +44.01%  (p=0.000 n=18+19)

Fixes #17857

Change-Id: I08dfb10a1c7e001817729dbfcc951bda12fe8814
Reviewed-on: https://go-review.googlesource.com/42813
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
src/bytes/buffer.go
src/bytes/buffer_test.go