github.com/pingcap/badger@v1.5.1-0.20230103063557-828f39b09b6d/cache/z/rtutil_test.go (about) 1 package z 2 3 import ( 4 "crypto/rand" 5 "hash/fnv" 6 "testing" 7 8 "github.com/dgryski/go-farm" 9 ) 10 11 func BenchmarkMemHash(b *testing.B) { 12 buf := make([]byte, 64) 13 rand.Read(buf) 14 for i := 0; i < b.N; i++ { 15 MemHash(buf) 16 } 17 } 18 19 func BenchmarkSip(b *testing.B) { 20 buf := make([]byte, 64) 21 rand.Read(buf) 22 for i := 0; i < b.N; i++ { 23 SipHash(buf) 24 } 25 } 26 27 func BenchmarkFarm(b *testing.B) { 28 buf := make([]byte, 64) 29 rand.Read(buf) 30 for i := 0; i < b.N; i++ { 31 farm.Fingerprint64(buf) 32 } 33 } 34 35 func BenchmarkFnv(b *testing.B) { 36 buf := make([]byte, 64) 37 rand.Read(buf) 38 f := fnv.New64a() 39 for i := 0; i < b.N; i++ { 40 f.Write(buf) 41 f.Sum64() 42 f.Reset() 43 } 44 } 45 46 func SipHash(p []byte) (l, h uint64) { 47 // Initialization. 48 v0 := uint64(8317987320269560794) // k0 ^ 0x736f6d6570736575 49 v1 := uint64(7237128889637516672) // k1 ^ 0x646f72616e646f6d 50 v2 := uint64(7816392314733513934) // k0 ^ 0x6c7967656e657261 51 v3 := uint64(8387220255325274014) // k1 ^ 0x7465646279746573 52 t := uint64(len(p)) << 56 53 54 // Compression. 55 for len(p) >= 8 { 56 57 m := uint64(p[0]) | uint64(p[1])<<8 | uint64(p[2])<<16 | uint64(p[3])<<24 | 58 uint64(p[4])<<32 | uint64(p[5])<<40 | uint64(p[6])<<48 | uint64(p[7])<<56 59 60 v3 ^= m 61 62 // Round 1. 63 v0 += v1 64 v1 = v1<<13 | v1>>51 65 v1 ^= v0 66 v0 = v0<<32 | v0>>32 67 68 v2 += v3 69 v3 = v3<<16 | v3>>48 70 v3 ^= v2 71 72 v0 += v3 73 v3 = v3<<21 | v3>>43 74 v3 ^= v0 75 76 v2 += v1 77 v1 = v1<<17 | v1>>47 78 v1 ^= v2 79 v2 = v2<<32 | v2>>32 80 81 // Round 2. 82 v0 += v1 83 v1 = v1<<13 | v1>>51 84 v1 ^= v0 85 v0 = v0<<32 | v0>>32 86 87 v2 += v3 88 v3 = v3<<16 | v3>>48 89 v3 ^= v2 90 91 v0 += v3 92 v3 = v3<<21 | v3>>43 93 v3 ^= v0 94 95 v2 += v1 96 v1 = v1<<17 | v1>>47 97 v1 ^= v2 98 v2 = v2<<32 | v2>>32 99 100 v0 ^= m 101 p = p[8:] 102 } 103 104 // Compress last block. 105 switch len(p) { 106 case 7: 107 t |= uint64(p[6]) << 48 108 fallthrough 109 case 6: 110 t |= uint64(p[5]) << 40 111 fallthrough 112 case 5: 113 t |= uint64(p[4]) << 32 114 fallthrough 115 case 4: 116 t |= uint64(p[3]) << 24 117 fallthrough 118 case 3: 119 t |= uint64(p[2]) << 16 120 fallthrough 121 case 2: 122 t |= uint64(p[1]) << 8 123 fallthrough 124 case 1: 125 t |= uint64(p[0]) 126 } 127 128 v3 ^= t 129 130 // Round 1. 131 v0 += v1 132 v1 = v1<<13 | v1>>51 133 v1 ^= v0 134 v0 = v0<<32 | v0>>32 135 136 v2 += v3 137 v3 = v3<<16 | v3>>48 138 v3 ^= v2 139 140 v0 += v3 141 v3 = v3<<21 | v3>>43 142 v3 ^= v0 143 144 v2 += v1 145 v1 = v1<<17 | v1>>47 146 v1 ^= v2 147 v2 = v2<<32 | v2>>32 148 149 // Round 2. 150 v0 += v1 151 v1 = v1<<13 | v1>>51 152 v1 ^= v0 153 v0 = v0<<32 | v0>>32 154 155 v2 += v3 156 v3 = v3<<16 | v3>>48 157 v3 ^= v2 158 159 v0 += v3 160 v3 = v3<<21 | v3>>43 161 v3 ^= v0 162 163 v2 += v1 164 v1 = v1<<17 | v1>>47 165 v1 ^= v2 166 v2 = v2<<32 | v2>>32 167 168 v0 ^= t 169 170 // Finalization. 171 v2 ^= 0xff 172 173 // Round 1. 174 v0 += v1 175 v1 = v1<<13 | v1>>51 176 v1 ^= v0 177 v0 = v0<<32 | v0>>32 178 179 v2 += v3 180 v3 = v3<<16 | v3>>48 181 v3 ^= v2 182 183 v0 += v3 184 v3 = v3<<21 | v3>>43 185 v3 ^= v0 186 187 v2 += v1 188 v1 = v1<<17 | v1>>47 189 v1 ^= v2 190 v2 = v2<<32 | v2>>32 191 192 // Round 2. 193 v0 += v1 194 v1 = v1<<13 | v1>>51 195 v1 ^= v0 196 v0 = v0<<32 | v0>>32 197 198 v2 += v3 199 v3 = v3<<16 | v3>>48 200 v3 ^= v2 201 202 v0 += v3 203 v3 = v3<<21 | v3>>43 204 v3 ^= v0 205 206 v2 += v1 207 v1 = v1<<17 | v1>>47 208 v1 ^= v2 209 v2 = v2<<32 | v2>>32 210 211 // Round 3. 212 v0 += v1 213 v1 = v1<<13 | v1>>51 214 v1 ^= v0 215 v0 = v0<<32 | v0>>32 216 217 v2 += v3 218 v3 = v3<<16 | v3>>48 219 v3 ^= v2 220 221 v0 += v3 222 v3 = v3<<21 | v3>>43 223 v3 ^= v0 224 225 v2 += v1 226 v1 = v1<<17 | v1>>47 227 v1 ^= v2 228 v2 = v2<<32 | v2>>32 229 230 // Round 4. 231 v0 += v1 232 v1 = v1<<13 | v1>>51 233 v1 ^= v0 234 v0 = v0<<32 | v0>>32 235 236 v2 += v3 237 v3 = v3<<16 | v3>>48 238 v3 ^= v2 239 240 v0 += v3 241 v3 = v3<<21 | v3>>43 242 v3 ^= v0 243 244 v2 += v1 245 v1 = v1<<17 | v1>>47 246 v1 ^= v2 247 v2 = v2<<32 | v2>>32 248 249 // return v0 ^ v1 ^ v2 ^ v3 250 251 hash := v0 ^ v1 ^ v2 ^ v3 252 h = hash >> 1 253 l = hash << 1 >> 1 254 return l, h 255 256 } 257 func BenchmarkNanoTime(b *testing.B) { 258 for i := 0; i < b.N; i++ { 259 NanoTime() 260 } 261 } 262 263 func BenchmarkCPUTicks(b *testing.B) { 264 for i := 0; i < b.N; i++ { 265 CPUTicks() 266 } 267 } 268 269 func BenchmarkFastRand(b *testing.B) { 270 for i := 0; i < b.N; i++ { 271 FastRand() 272 } 273 }