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  }