当golang为字符串到字节转换进行分配时

Vis*_*mar 6 allocation go

var testString = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
//var testString = "ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ"
func BenchmarkHashing900000000(b *testing.B){
    var bufByte = bytes.Buffer{}
    for i := 0; i < b.N ; i++{
        bufByte.WriteString(testString)
        Sum32(bufByte.Bytes())
        bufByte.Reset()
    }
}

func BenchmarkHashingWithNew900000000(b *testing.B){
    for i := 0; i < b.N ; i++{
        bytStr := []byte(testString)
        Sum32(bytStr)
    }
}
Run Code Online (Sandbox Code Playgroud)

测试结果:

With  testString = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
BenchmarkHashing900000000-4         50000000            35.2 ns/op         0 B/op          0 allocs/op
BenchmarkHashingWithNew900000000-4  50000000            30.9 ns/op         0 B/op          0 allocs/op

With testString = "ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ"
BenchmarkHashing900000000-4         30000000            46.6 ns/op         0 B/op          0 allocs/op
BenchmarkHashingWithNew900000000-4  20000000            73.0 ns/op        64 B/op          1 allocs/op
Run Code Online (Sandbox Code Playgroud)

为什么在Bench'sHashingWithNew900000000的情况下,当字符串很长时有分配,但是当字符串很小时没有分配.
Sum32:https://gowalker.org/github.com/spaolacci/murmur3
我正在使用go1.6

Rol*_*lig -1

当您向 a 写入内容时byte.Buffer,它会根据需要分配内存。当您调用 时byte.Buffer.Reset,该内存不会被释放,而是会保留以供以后重用。你的代码正是这样做的。它将缓冲区标记为空,然后再次填充它。

实际上,存在一些分配,但是当迭代 50000000 次时,它可以忽略不计。但如果将 for 声明bufByte移至循环中for,您将获得一些分配。