]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: add 2-byte and 8-byte sub-benchmarks for memmove load/store
authorHeisenberg <lziqiang1@gmail.com>
Tue, 8 Sep 2020 06:31:39 +0000 (14:31 +0800)
committerKeith Randall <khr@golang.org>
Tue, 27 Oct 2020 19:52:40 +0000 (19:52 +0000)
Change-Id: I6389d7efe90836b6ece44d2e75053d1ad9f35d08
Reviewed-on: https://go-review.googlesource.com/c/go/+/253417
Trust: Emmanuel Odeke <emmanuel@orijtech.com>
Reviewed-by: Keith Randall <khr@golang.org>
src/runtime/memmove_test.go

index 396c1304c56c397921c63e68f1fadf718d0b2df9..b549433f71ce66e47be0d17cbac323a94e8de77b 100644 (file)
@@ -538,21 +538,30 @@ func BenchmarkCopyFat1024(b *testing.B) {
        }
 }
 
+// BenchmarkIssue18740 ensures that memmove uses 4 and 8 byte load/store to move 4 and 8 bytes.
+// It used to do 2 2-byte load/stores, which leads to a pipeline stall
+// when we try to read the result with one 4-byte load.
 func BenchmarkIssue18740(b *testing.B) {
-       // This tests that memmove uses one 4-byte load/store to move 4 bytes.
-       // It used to do 2 2-byte load/stores, which leads to a pipeline stall
-       // when we try to read the result with one 4-byte load.
-       var buf [4]byte
-       for j := 0; j < b.N; j++ {
-               s := uint32(0)
-               for i := 0; i < 4096; i += 4 {
-                       copy(buf[:], g[i:])
-                       s += binary.LittleEndian.Uint32(buf[:])
-               }
-               sink = uint64(s)
+       benchmarks := []struct {
+               name  string
+               nbyte int
+               f     func([]byte) uint64
+       }{
+               {"2byte", 2, func(buf []byte) uint64 { return uint64(binary.LittleEndian.Uint16(buf)) }},
+               {"4byte", 4, func(buf []byte) uint64 { return uint64(binary.LittleEndian.Uint32(buf)) }},
+               {"8byte", 8, func(buf []byte) uint64 { return binary.LittleEndian.Uint64(buf) }},
+       }
+
+       var g [4096]byte
+       for _, bm := range benchmarks {
+               buf := make([]byte, bm.nbyte)
+               b.Run(bm.name, func(b *testing.B) {
+                       for j := 0; j < b.N; j++ {
+                               for i := 0; i < 4096; i += bm.nbyte {
+                                       copy(buf[:], g[i:])
+                                       sink += bm.f(buf[:])
+                               }
+                       }
+               })
        }
 }
-
-// TODO: 2 byte and 8 byte benchmarks also.
-
-var g [4096]byte