github.com/linapex/ethereum-go-chinese@v0.0.0-20190316121929-f8b7a73c3fa1/common/bitutil/bitutil_test.go (about)

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