github.com/yinchengtsinghua/golang-Eos-dpos-Ethereum@v0.0.0-20190121132951-92cc4225ed8e/common/bitutil/bitutil_test.go (about)

     1  
     2  //此源码被清华学神尹成大魔王专业翻译分析并修改
     3  //尹成QQ77025077
     4  //尹成微信18510341407
     5  //尹成所在QQ群721929980
     6  //尹成邮箱 yinc13@mails.tsinghua.edu.cn
     7  //尹成毕业于清华大学,微软区块链领域全球最有价值专家
     8  //https://mvp.microsoft.com/zh-cn/PublicProfile/4033620
     9  //版权所有2013 Go作者。版权所有。
    10  //此源代码的使用受BSD样式的控制
    11  //可以在许可文件中找到的许可证。
    12  
    13  //改编自:https://golang.org/src/crypto/cipher/xor_test.go
    14  
    15  package bitutil
    16  
    17  import (
    18  	"bytes"
    19  	"testing"
    20  )
    21  
    22  //测试按位XOR适用于各种对齐。
    23  func TestXOR(t *testing.T) {
    24  	for alignP := 0; alignP < 2; alignP++ {
    25  		for alignQ := 0; alignQ < 2; alignQ++ {
    26  			for alignD := 0; alignD < 2; alignD++ {
    27  				p := make([]byte, 1023)[alignP:]
    28  				q := make([]byte, 1023)[alignQ:]
    29  
    30  				for i := 0; i < len(p); i++ {
    31  					p[i] = byte(i)
    32  				}
    33  				for i := 0; i < len(q); i++ {
    34  					q[i] = byte(len(q) - i)
    35  				}
    36  				d1 := make([]byte, 1023+alignD)[alignD:]
    37  				d2 := make([]byte, 1023+alignD)[alignD:]
    38  
    39  				XORBytes(d1, p, q)
    40  				safeXORBytes(d2, p, q)
    41  				if !bytes.Equal(d1, d2) {
    42  					t.Error("not equal", d1, d2)
    43  				}
    44  			}
    45  		}
    46  	}
    47  }
    48  
    49  //测试按位排列并适用于各种对齐。
    50  func TestAND(t *testing.T) {
    51  	for alignP := 0; alignP < 2; alignP++ {
    52  		for alignQ := 0; alignQ < 2; alignQ++ {
    53  			for alignD := 0; alignD < 2; alignD++ {
    54  				p := make([]byte, 1023)[alignP:]
    55  				q := make([]byte, 1023)[alignQ:]
    56  
    57  				for i := 0; i < len(p); i++ {
    58  					p[i] = byte(i)
    59  				}
    60  				for i := 0; i < len(q); i++ {
    61  					q[i] = byte(len(q) - i)
    62  				}
    63  				d1 := make([]byte, 1023+alignD)[alignD:]
    64  				d2 := make([]byte, 1023+alignD)[alignD:]
    65  
    66  				ANDBytes(d1, p, q)
    67  				safeANDBytes(d2, p, q)
    68  				if !bytes.Equal(d1, d2) {
    69  					t.Error("not equal")
    70  				}
    71  			}
    72  		}
    73  	}
    74  }
    75  
    76  //
    77  func TestOR(t *testing.T) {
    78  	for alignP := 0; alignP < 2; alignP++ {
    79  		for alignQ := 0; alignQ < 2; alignQ++ {
    80  			for alignD := 0; alignD < 2; alignD++ {
    81  				p := make([]byte, 1023)[alignP:]
    82  				q := make([]byte, 1023)[alignQ:]
    83  
    84  				for i := 0; i < len(p); i++ {
    85  					p[i] = byte(i)
    86  				}
    87  				for i := 0; i < len(q); i++ {
    88  					q[i] = byte(len(q) - i)
    89  				}
    90  				d1 := make([]byte, 1023+alignD)[alignD:]
    91  				d2 := make([]byte, 1023+alignD)[alignD:]
    92  
    93  				ORBytes(d1, p, q)
    94  				safeORBytes(d2, p, q)
    95  				if !bytes.Equal(d1, d2) {
    96  					t.Error("not equal")
    97  				}
    98  			}
    99  		}
   100  	}
   101  }
   102  
   103  //位测试适用于各种对齐的测试。
   104  func TestTest(t *testing.T) {
   105  	for align := 0; align < 2; align++ {
   106  //测试批量部件中的位集
   107  		p := make([]byte, 1023)[align:]
   108  		p[100] = 1
   109  
   110  		if TestBytes(p) != safeTestBytes(p) {
   111  			t.Error("not equal")
   112  		}
   113  //
   114  		q := make([]byte, 1023)[align:]
   115  		q[len(q)-1] = 1
   116  
   117  		if TestBytes(q) != safeTestBytes(q) {
   118  			t.Error("not equal")
   119  		}
   120  	}
   121  }
   122  
   123  //对可能优化的XOR性能进行基准测试。
   124  func BenchmarkFastXOR1KB(b *testing.B) { benchmarkFastXOR(b, 1024) }
   125  func BenchmarkFastXOR2KB(b *testing.B) { benchmarkFastXOR(b, 2048) }
   126  func BenchmarkFastXOR4KB(b *testing.B) { benchmarkFastXOR(b, 4096) }
   127  
   128  func benchmarkFastXOR(b *testing.B, size int) {
   129  	p, q := make([]byte, size), make([]byte, size)
   130  
   131  	for i := 0; i < b.N; i++ {
   132  		XORBytes(p, p, q)
   133  	}
   134  }
   135  
   136  //基准测试基线XOR性能。
   137  func BenchmarkBaseXOR1KB(b *testing.B) { benchmarkBaseXOR(b, 1024) }
   138  func BenchmarkBaseXOR2KB(b *testing.B) { benchmarkBaseXOR(b, 2048) }
   139  func BenchmarkBaseXOR4KB(b *testing.B) { benchmarkBaseXOR(b, 4096) }
   140  
   141  func benchmarkBaseXOR(b *testing.B, size int) {
   142  	p, q := make([]byte, size), make([]byte, size)
   143  
   144  	for i := 0; i < b.N; i++ {
   145  		safeXORBytes(p, p, q)
   146  	}
   147  }
   148  
   149  //对潜在的优化和性能进行基准测试。
   150  func BenchmarkFastAND1KB(b *testing.B) { benchmarkFastAND(b, 1024) }
   151  func BenchmarkFastAND2KB(b *testing.B) { benchmarkFastAND(b, 2048) }
   152  func BenchmarkFastAND4KB(b *testing.B) { benchmarkFastAND(b, 4096) }
   153  
   154  func benchmarkFastAND(b *testing.B, size int) {
   155  	p, q := make([]byte, size), make([]byte, size)
   156  
   157  	for i := 0; i < b.N; i++ {
   158  		ANDBytes(p, p, q)
   159  	}
   160  }
   161  
   162  //基准线和绩效。
   163  func BenchmarkBaseAND1KB(b *testing.B) { benchmarkBaseAND(b, 1024) }
   164  func BenchmarkBaseAND2KB(b *testing.B) { benchmarkBaseAND(b, 2048) }
   165  func BenchmarkBaseAND4KB(b *testing.B) { benchmarkBaseAND(b, 4096) }
   166  
   167  func benchmarkBaseAND(b *testing.B, size int) {
   168  	p, q := make([]byte, size), make([]byte, size)
   169  
   170  	for i := 0; i < b.N; i++ {
   171  		safeANDBytes(p, p, q)
   172  	}
   173  }
   174  
   175  //对潜在的优化或性能进行基准测试。
   176  func BenchmarkFastOR1KB(b *testing.B) { benchmarkFastOR(b, 1024) }
   177  func BenchmarkFastOR2KB(b *testing.B) { benchmarkFastOR(b, 2048) }
   178  func BenchmarkFastOR4KB(b *testing.B) { benchmarkFastOR(b, 4096) }
   179  
   180  func benchmarkFastOR(b *testing.B, size int) {
   181  	p, q := make([]byte, size), make([]byte, size)
   182  
   183  	for i := 0; i < b.N; i++ {
   184  		ORBytes(p, p, q)
   185  	}
   186  }
   187  
   188  //基准线或绩效。
   189  func BenchmarkBaseOR1KB(b *testing.B) { benchmarkBaseOR(b, 1024) }
   190  func BenchmarkBaseOR2KB(b *testing.B) { benchmarkBaseOR(b, 2048) }
   191  func BenchmarkBaseOR4KB(b *testing.B) { benchmarkBaseOR(b, 4096) }
   192  
   193  func benchmarkBaseOR(b *testing.B, size int) {
   194  	p, q := make([]byte, size), make([]byte, size)
   195  
   196  	for i := 0; i < b.N; i++ {
   197  		safeORBytes(p, p, q)
   198  	}
   199  }
   200  
   201  //对可能优化的位测试性能进行基准测试。
   202  func BenchmarkFastTest1KB(b *testing.B) { benchmarkFastTest(b, 1024) }
   203  func BenchmarkFastTest2KB(b *testing.B) { benchmarkFastTest(b, 2048) }
   204  func BenchmarkFastTest4KB(b *testing.B) { benchmarkFastTest(b, 4096) }
   205  
   206  func benchmarkFastTest(b *testing.B, size int) {
   207  	p := make([]byte, size)
   208  	for i := 0; i < b.N; i++ {
   209  		TestBytes(p)
   210  	}
   211  }
   212  
   213  //基准测试基线位测试性能。
   214  func BenchmarkBaseTest1KB(b *testing.B) { benchmarkBaseTest(b, 1024) }
   215  func BenchmarkBaseTest2KB(b *testing.B) { benchmarkBaseTest(b, 2048) }
   216  func BenchmarkBaseTest4KB(b *testing.B) { benchmarkBaseTest(b, 4096) }
   217  
   218  func benchmarkBaseTest(b *testing.B, size int) {
   219  	p := make([]byte, size)
   220  	for i := 0; i < b.N; i++ {
   221  		safeTestBytes(p)
   222  	}
   223  }