]> Cypherpunks repositories - gostls13.git/commitdiff
bytes: don't compact Buffer so aggressively
authorBrad Fitzpatrick <bradfitz@golang.org>
Fri, 29 Mar 2013 20:49:14 +0000 (13:49 -0700)
committerBrad Fitzpatrick <bradfitz@golang.org>
Fri, 29 Mar 2013 20:49:14 +0000 (13:49 -0700)
benchmark                           old ns/op    new ns/op    delta
BenchmarkBufferNotEmptyWriteRead       848416       819983   -3.35%

Update #5154

R=golang-dev, gri, robryk
CC=golang-dev
https://golang.org/cl/8173043

src/pkg/bytes/buffer.go
src/pkg/bytes/buffer_test.go

index 0328f4c2d8d42aac886ccb1b19d499b735ed580f..69ac6cc014f53364c42d6860fffd4c9a9c3a233f 100644 (file)
@@ -87,9 +87,11 @@ func (b *Buffer) grow(n int) int {
                var buf []byte
                if b.buf == nil && n <= len(b.bootstrap) {
                        buf = b.bootstrap[0:]
-               } else if m+n <= cap(b.buf) {
-                       // We can slide things down instead of
-                       // allocating a new slice.
+               } else if m+n <= cap(b.buf)/2 {
+                       // We can slide things down instead of allocating a new
+                       // slice. We only need m+n <= cap(b.buf) to slide, but
+                       // we instead let capacity get twice as large so we
+                       // don't spend all our time copying.
                        copy(b.buf[:], b.buf[b.off:])
                        buf = b.buf[:m]
                } else {
index d629809b576abeef98e4e5ac8bb5f32cc81e3f95..5b0b8b50cf7f6fc4232de039bd2e5efb1d58258a 100644 (file)
@@ -490,8 +490,10 @@ func TestBufferGrowth(t *testing.T) {
                }
        }
        cap1 := b.Cap()
-       if cap1 > cap0 {
-               t.Errorf("buffer cap = %d; too big", cap1)
+       // (*Buffer).grow allows for 2x capacity slop before sliding,
+       // so set our error threshold at 3x.
+       if cap1 > cap0*3 {
+               t.Errorf("buffer cap = %d; too big (grew from %d)", cap1, cap0)
        }
 }