github.com/liujq9674git/golang-src-1.7@v0.0.0-20230517174348-17f6ec47f3f8/src/runtime/memmove_test.go (about) 1 // Copyright 2013 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package runtime_test 6 7 import ( 8 "fmt" 9 . "runtime" 10 "testing" 11 ) 12 13 func TestMemmove(t *testing.T) { 14 size := 256 15 if testing.Short() { 16 size = 128 + 16 17 } 18 src := make([]byte, size) 19 dst := make([]byte, size) 20 for i := 0; i < size; i++ { 21 src[i] = byte(128 + (i & 127)) 22 } 23 for i := 0; i < size; i++ { 24 dst[i] = byte(i & 127) 25 } 26 for n := 0; n <= size; n++ { 27 for x := 0; x <= size-n; x++ { // offset in src 28 for y := 0; y <= size-n; y++ { // offset in dst 29 copy(dst[y:y+n], src[x:x+n]) 30 for i := 0; i < y; i++ { 31 if dst[i] != byte(i&127) { 32 t.Fatalf("prefix dst[%d] = %d", i, dst[i]) 33 } 34 } 35 for i := y; i < y+n; i++ { 36 if dst[i] != byte(128+((i-y+x)&127)) { 37 t.Fatalf("copied dst[%d] = %d", i, dst[i]) 38 } 39 dst[i] = byte(i & 127) // reset dst 40 } 41 for i := y + n; i < size; i++ { 42 if dst[i] != byte(i&127) { 43 t.Fatalf("suffix dst[%d] = %d", i, dst[i]) 44 } 45 } 46 } 47 } 48 } 49 } 50 51 func TestMemmoveAlias(t *testing.T) { 52 size := 256 53 if testing.Short() { 54 size = 128 + 16 55 } 56 buf := make([]byte, size) 57 for i := 0; i < size; i++ { 58 buf[i] = byte(i) 59 } 60 for n := 0; n <= size; n++ { 61 for x := 0; x <= size-n; x++ { // src offset 62 for y := 0; y <= size-n; y++ { // dst offset 63 copy(buf[y:y+n], buf[x:x+n]) 64 for i := 0; i < y; i++ { 65 if buf[i] != byte(i) { 66 t.Fatalf("prefix buf[%d] = %d", i, buf[i]) 67 } 68 } 69 for i := y; i < y+n; i++ { 70 if buf[i] != byte(i-y+x) { 71 t.Fatalf("copied buf[%d] = %d", i, buf[i]) 72 } 73 buf[i] = byte(i) // reset buf 74 } 75 for i := y + n; i < size; i++ { 76 if buf[i] != byte(i) { 77 t.Fatalf("suffix buf[%d] = %d", i, buf[i]) 78 } 79 } 80 } 81 } 82 } 83 } 84 85 func benchmarkSizes(b *testing.B, sizes []int, fn func(b *testing.B, n int)) { 86 for _, n := range sizes { 87 b.Run(fmt.Sprint(n), func(b *testing.B) { 88 b.SetBytes(int64(n)) 89 fn(b, n) 90 }) 91 } 92 } 93 94 var bufSizes = []int{ 95 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 96 32, 64, 128, 256, 512, 1024, 2048, 4096, 97 } 98 99 func BenchmarkMemmove(b *testing.B) { 100 benchmarkSizes(b, bufSizes, func(b *testing.B, n int) { 101 x := make([]byte, n) 102 y := make([]byte, n) 103 for i := 0; i < b.N; i++ { 104 copy(x, y) 105 } 106 }) 107 } 108 109 func BenchmarkMemmoveUnalignedDst(b *testing.B) { 110 benchmarkSizes(b, bufSizes, func(b *testing.B, n int) { 111 x := make([]byte, n+1) 112 y := make([]byte, n) 113 for i := 0; i < b.N; i++ { 114 copy(x[1:], y) 115 } 116 }) 117 } 118 119 func BenchmarkMemmoveUnalignedSrc(b *testing.B) { 120 benchmarkSizes(b, bufSizes, func(b *testing.B, n int) { 121 x := make([]byte, n) 122 y := make([]byte, n+1) 123 for i := 0; i < b.N; i++ { 124 copy(x, y[1:]) 125 } 126 }) 127 } 128 129 func TestMemclr(t *testing.T) { 130 size := 512 131 if testing.Short() { 132 size = 128 + 16 133 } 134 mem := make([]byte, size) 135 for i := 0; i < size; i++ { 136 mem[i] = 0xee 137 } 138 for n := 0; n < size; n++ { 139 for x := 0; x <= size-n; x++ { // offset in mem 140 MemclrBytes(mem[x : x+n]) 141 for i := 0; i < x; i++ { 142 if mem[i] != 0xee { 143 t.Fatalf("overwrite prefix mem[%d] = %d", i, mem[i]) 144 } 145 } 146 for i := x; i < x+n; i++ { 147 if mem[i] != 0 { 148 t.Fatalf("failed clear mem[%d] = %d", i, mem[i]) 149 } 150 mem[i] = 0xee 151 } 152 for i := x + n; i < size; i++ { 153 if mem[i] != 0xee { 154 t.Fatalf("overwrite suffix mem[%d] = %d", i, mem[i]) 155 } 156 } 157 } 158 } 159 } 160 161 func BenchmarkMemclr(b *testing.B) { 162 for _, n := range []int{5, 16, 64, 256, 4096, 65536} { 163 x := make([]byte, n) 164 b.Run(fmt.Sprint(n), func(b *testing.B) { 165 b.SetBytes(int64(n)) 166 for i := 0; i < b.N; i++ { 167 MemclrBytes(x) 168 } 169 }) 170 } 171 for _, m := range []int{1, 4, 8, 16, 64} { 172 x := make([]byte, m<<20) 173 b.Run(fmt.Sprint(m, "M"), func(b *testing.B) { 174 b.SetBytes(int64(m << 20)) 175 for i := 0; i < b.N; i++ { 176 MemclrBytes(x) 177 } 178 }) 179 } 180 } 181 182 func BenchmarkGoMemclr(b *testing.B) { 183 benchmarkSizes(b, []int{5, 16, 64, 256}, func(b *testing.B, n int) { 184 x := make([]byte, n) 185 for i := 0; i < b.N; i++ { 186 for j := range x { 187 x[j] = 0 188 } 189 } 190 }) 191 } 192 193 func BenchmarkClearFat8(b *testing.B) { 194 for i := 0; i < b.N; i++ { 195 var x [8 / 4]uint32 196 _ = x 197 } 198 } 199 func BenchmarkClearFat12(b *testing.B) { 200 for i := 0; i < b.N; i++ { 201 var x [12 / 4]uint32 202 _ = x 203 } 204 } 205 func BenchmarkClearFat16(b *testing.B) { 206 for i := 0; i < b.N; i++ { 207 var x [16 / 4]uint32 208 _ = x 209 } 210 } 211 func BenchmarkClearFat24(b *testing.B) { 212 for i := 0; i < b.N; i++ { 213 var x [24 / 4]uint32 214 _ = x 215 } 216 } 217 func BenchmarkClearFat32(b *testing.B) { 218 for i := 0; i < b.N; i++ { 219 var x [32 / 4]uint32 220 _ = x 221 } 222 } 223 func BenchmarkClearFat40(b *testing.B) { 224 for i := 0; i < b.N; i++ { 225 var x [40 / 4]uint32 226 _ = x 227 } 228 } 229 func BenchmarkClearFat48(b *testing.B) { 230 for i := 0; i < b.N; i++ { 231 var x [48 / 4]uint32 232 _ = x 233 } 234 } 235 func BenchmarkClearFat56(b *testing.B) { 236 for i := 0; i < b.N; i++ { 237 var x [56 / 4]uint32 238 _ = x 239 } 240 } 241 func BenchmarkClearFat64(b *testing.B) { 242 for i := 0; i < b.N; i++ { 243 var x [64 / 4]uint32 244 _ = x 245 } 246 } 247 func BenchmarkClearFat128(b *testing.B) { 248 for i := 0; i < b.N; i++ { 249 var x [128 / 4]uint32 250 _ = x 251 } 252 } 253 func BenchmarkClearFat256(b *testing.B) { 254 for i := 0; i < b.N; i++ { 255 var x [256 / 4]uint32 256 _ = x 257 } 258 } 259 func BenchmarkClearFat512(b *testing.B) { 260 for i := 0; i < b.N; i++ { 261 var x [512 / 4]uint32 262 _ = x 263 } 264 } 265 func BenchmarkClearFat1024(b *testing.B) { 266 for i := 0; i < b.N; i++ { 267 var x [1024 / 4]uint32 268 _ = x 269 } 270 } 271 272 func BenchmarkCopyFat8(b *testing.B) { 273 var x [8 / 4]uint32 274 for i := 0; i < b.N; i++ { 275 y := x 276 _ = y 277 } 278 } 279 func BenchmarkCopyFat12(b *testing.B) { 280 var x [12 / 4]uint32 281 for i := 0; i < b.N; i++ { 282 y := x 283 _ = y 284 } 285 } 286 func BenchmarkCopyFat16(b *testing.B) { 287 var x [16 / 4]uint32 288 for i := 0; i < b.N; i++ { 289 y := x 290 _ = y 291 } 292 } 293 func BenchmarkCopyFat24(b *testing.B) { 294 var x [24 / 4]uint32 295 for i := 0; i < b.N; i++ { 296 y := x 297 _ = y 298 } 299 } 300 func BenchmarkCopyFat32(b *testing.B) { 301 var x [32 / 4]uint32 302 for i := 0; i < b.N; i++ { 303 y := x 304 _ = y 305 } 306 } 307 func BenchmarkCopyFat64(b *testing.B) { 308 var x [64 / 4]uint32 309 for i := 0; i < b.N; i++ { 310 y := x 311 _ = y 312 } 313 } 314 func BenchmarkCopyFat128(b *testing.B) { 315 var x [128 / 4]uint32 316 for i := 0; i < b.N; i++ { 317 y := x 318 _ = y 319 } 320 } 321 func BenchmarkCopyFat256(b *testing.B) { 322 var x [256 / 4]uint32 323 for i := 0; i < b.N; i++ { 324 y := x 325 _ = y 326 } 327 } 328 func BenchmarkCopyFat512(b *testing.B) { 329 var x [512 / 4]uint32 330 for i := 0; i < b.N; i++ { 331 y := x 332 _ = y 333 } 334 } 335 func BenchmarkCopyFat1024(b *testing.B) { 336 var x [1024 / 4]uint32 337 for i := 0; i < b.N; i++ { 338 y := x 339 _ = y 340 } 341 }