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,您将获得一些分配。
| 归档时间: |
|
| 查看次数: |
1682 次 |
| 最近记录: |