根据下面所示的Go基准测试(通过运行go test -v -bench=. -benchmem
),将一个字节的数组附加到一个数组中,每个操作需要1次分配.
Benchmark_AddOneByteArray-4 1986709 581.2 ns/op 1792 B/op 1 allocs/op
但是,附加一个2字节的数组每个操作需要花费101个分配,这与附加一个32字节的数组(101个分配)相同.
Benchmark_AddTwoByteArray
Benchmark_AddTwoByteArray-4 529726 2235 ns/op 1992 B/op 101 allocs/op
Benchmark_AddThirtyTwoByteArray
Benchmark_AddThirtyTwoByteArray-4 282092 4431 ns/op 4992 B/op 101 allocs/op
为什么附加一个字节数组每次操作只需要1次分配,而所有其他测试大小的数组每次操作只需要101次分配?
func addOneByteArray(n int) []any {
my_array := make([]any, n)
for i := 0; i < n; i++ {
my_array[i] = [1]byte{}
}
return my_array
}
func addTwoByteArray(n int) []any {
my_array := make([]any, n)
for i := 0; i < n; i++ {
my_array[i] = [2]byte{}
}
return my_array
}
func addThirtyTwoByteArray(n int) []any {
my_array := make([]any, n)
for i := 0; i < n; i++ {
my_array[i] = [32]byte{}
}
return my_array
}
var N = 100
func Benchmark_AddOneByteArray(b *testing.B) {
for i := 0; i < b.N; i++ {
_ = addOneByteArray(N)
}
}
func Benchmark_AddTwoByteArray(b *testing.B) {
for i := 0; i < b.N; i++ {
_ = addTwoByteArray(N)
}
}
func Benchmark_AddThirtyTwoByteArray(b *testing.B) {
for i := 0; i < b.N; i++ {
_ = addThirtyTwoByteArray(N)
}
}