Skip to content

Commit

Permalink
runtime: use old capacity to decide on append growth regime
Browse files Browse the repository at this point in the history
We grow the backing store on append by 2x for small sizes and 1.25x
for large sizes. The threshold we use for picking the growth factor
used to depend on the old length, not the old capacity. That's kind of
unfortunate, because then doing append(s, 0, 0) and append(append(s,
0), 0) do different things. (If s has one more spot available, then
the former expression chooses its growth based on len(s) and the
latter on len(s)+1.)  If we instead use the old capacity, we get more
consistent behavior. (Both expressions use len(s)+1 == cap(s) to
decide.)

Fixes #41239

Change-Id: I40686471d256edd72ec92aef973a89b52e235d4b
Reviewed-on: https://go-review.googlesource.com/c/go/+/257338
Trust: Keith Randall <khr@golang.org>
Trust: Josh Bleecher Snyder <josharian@gmail.com>
Run-TryBot: Keith Randall <khr@golang.org>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Josh Bleecher Snyder <josharian@gmail.com>
  • Loading branch information
randall77 committed Sep 25, 2020
1 parent fa04d48 commit 2333c62
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 1 deletion.
2 changes: 1 addition & 1 deletion src/runtime/slice.go
Original file line number Diff line number Diff line change
Expand Up @@ -146,7 +146,7 @@ func growslice(et *_type, old slice, cap int) slice {
if cap > doublecap {
newcap = cap
} else {
if old.len < 1024 {
if old.cap < 1024 {
newcap = doublecap
} else {
// Check 0 < newcap to detect overflow
Expand Down
19 changes: 19 additions & 0 deletions test/fixedbugs/issue41239.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
// run

// Copyright 2020 The Go Authors. All rights reserved. Use of this
// source code is governed by a BSD-style license that can be found in
// the LICENSE file.

package main

import "fmt"

func main() {
const N = 1024
var a [N]int
x := cap(append(a[:N-1:N], 9, 9))
y := cap(append(a[:N:N], 9))
if x != y {
panic(fmt.Sprintf("different capacity on append: %d vs %d", x, y))
}
}

0 comments on commit 2333c62

Please sign in to comment.