| // Copyright 2011 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 runtime_test | |
| import "testing" | |
| const N = 20 | |
| func BenchmarkAppend(b *testing.B) { | |
| b.StopTimer() | |
| x := make([]int, 0, N) | |
| b.StartTimer() | |
| for i := 0; i < b.N; i++ { | |
| x = x[0:0] | |
| for j := 0; j < N; j++ { | |
| x = append(x, j) | |
| } | |
| } | |
| } | |
| func BenchmarkAppendSpecialCase(b *testing.B) { | |
| b.StopTimer() | |
| x := make([]int, 0, N) | |
| b.StartTimer() | |
| for i := 0; i < b.N; i++ { | |
| x = x[0:0] | |
| for j := 0; j < N; j++ { | |
| if len(x) < cap(x) { | |
| x = x[:len(x)+1] | |
| x[len(x)-1] = j | |
| } else { | |
| x = append(x, j) | |
| } | |
| } | |
| } | |
| } | |
| var x []int | |
| func f() int { | |
| x[:1][0] = 3 | |
| return 2 | |
| } | |
| func TestSideEffectOrder(t *testing.T) { | |
| x = make([]int, 0, 10) | |
| x = append(x, 1, f()) | |
| if x[0] != 1 || x[1] != 2 { | |
| t.Error("append failed: ", x[0], x[1]) | |
| } | |
| } |