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