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)
}
}
Testergebnis:Wenn golang tut Zuweisung für String-Byte Umwandlung
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
Warum es Zuteilung bei BenchmarkHashingWithNew900000000 ist, wenn String lang, aber keine Zuordnung, wenn Zeichenfolge klein ist.
Sum32: https://gowalker.org/github.com/spaolacci/murmur3
I go1.6
Das ist, was ich erwarten würde. Abgesehen von Benchmark-Shows für kleinere Strings gibt es in beiden Fällen keine Zuweisung. Aber es verhält sich wie erwartet für größere Saiten. –
Sie sollten sich den kompilierten Code ansehen. 'go test -c' und dann' go tool objdump -s 'BenchmarkHashing' main.test.exe'. –
@VishalKumar Für die 'bytes.Buffer'-Version sollte eigentlich keine Zuweisung in _either_ case angezeigt werden. Bytes.Buffer verfügt in seiner Struktur über ein eingebautes 64-Byte-Array zur Verarbeitung kleiner Datensätze ohne (zusätzliche) Zuweisung, und keiner dieser Tests überschreitet 64 Byte pro Schreiboperation. Wenn Sie 'bufByte.Reset()' außerhalb der for-Schleife bewegen, habe ich das Gefühl, dass Sie gerechtere Ergebnisse sehen. – Kaedys