摘自:https://github.com/golang/go/wiki/Performance
分配组合的一种特殊情况是切片数组预分配。 如果您知道切片的典型大小,则可以预分配后备 数组如下:
type X struct { buf []byte bufArray [16]byte // Buf usually does not grow beyond 16 bytes. } func MakeX() *X { x := &X{} // Preinitialize buf with the backing array. x.buf = x.bufArray[:0] return x }
测试差异:
package main
import "testing"
type buf struct {
b []byte
}
type buf2 struct {
b []byte
bt [2]byte
}
func B() *buf2 {
b := &buf2{}
b.b = b.bt[:0]
return b
}
func BenchmarkMake(b *testing.B) {
for i := 0; i < b.N; i++ {
b := &buf{}
b.b = make([]byte, 2, 2)
}
}
func BenchmarkPreallocation(b *testing.B) {
for i := 0; i < b.N; i++ {
b := B()
_ = b
}
}
输出:
[user@SYSTEM temp]$ go test -bench . -benchmem
goos: linux
goarch: amd64
pkg: temp
BenchmarkMake-8 100000000 12.7 ns/op 2 B/op 1 allocs/op
BenchmarkPreallocation-8 50000000 40.4 ns/op 32 B/op 1 allocs/op
为什么预分配缓慢?
为什么切片内部函数(指向操作)[:0]
使用32个字节来做到这一点?