| // 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]) |
| } |
| } |