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)
}
}
測試結果:當golang不分配字符串字節轉換
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
爲什麼在BenchmarkHashingWithNew900000000的情況下分配時字符串很長,但沒有配置字符串時小。
Sum32:https://gowalker.org/github.com/spaolacci/murmur3
當你寫的東西變成byte.Buffer
我使用go1.6
這是我所期望的。除了上面的基準線顯示較小的字符串,兩種情況下都沒有分配。但是,對於更大的字符串,它的行爲如預期。 –
你應該看看編譯的代碼。 '去測試-c'然後'去工具objdump -s'BenchmarkHashing'main.test.exe'。 –
@VishalKumar實際上,在'bytes.Buffer'版本的_either_情況下你不應該看到一個分配。 Bytes.Buffer在其結構中具有一個內置的64字節數組,用於處理沒有(額外)分配的小數據集,並且每個寫操作都不超過64個字節。如果你將'bufByte.Reset()'移到for循環之外,我感覺你會看到更公平的結果。 – Kaedys