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 }