*Why the XOR between*(*[]uintptr)(unsafe.Pointer(&dst)) is fast then []byte?*
I find a fast xor lib https://github.com/templexxx/xor, and write the benchmark below, the result show that BenchmarkFastXORWords is 5x faster than BenchmarkS afeXORBytes on my computer I can't figure out why? Anyone can help me. THX package main import ( "math/rand" "testing" "unsafe" ) const wordSize = int(unsafe.Sizeof(uintptr(0))) var e = make([]byte, 160) var f = make([]byte, 160) var g = make([]byte, 160) func init() { for i := 0; i < 160; i++ { rand.Seed(22) e[i] = byte(rand.Intn(256)) f[i] = byte(rand.Intn(256)) } } func BenchmarkSafeXORBytes(b *testing.B) { for i := 0; i < b.N; i++ { safeXORBytes(g, e, f) } } func BenchmarkFastXORWords(b *testing.B) { for i := 0; i < b.N; i++ { fastXORWords(g, e, f) } } func safeXORBytes(dst, a, b []byte) { n := len(a) ex := n % 8 for i := 0; i < ex; i++ { dst[i] = a[i] ^ b[i] } for i := ex; i < n; i += 8 { _dst := dst[i : i+8] _a := a[i : i+8] _b := b[i : i+8] _dst[0] = _a[0] ^ _b[0] _dst[1] = _a[1] ^ _b[1] _dst[2] = _a[2] ^ _b[2] _dst[3] = _a[3] ^ _b[3] _dst[4] = _a[4] ^ _b[4] _dst[5] = _a[5] ^ _b[5] _dst[6] = _a[6] ^ _b[6] _dst[7] = _a[7] ^ _b[7] } } func fastXORWords(dst, a, b []byte) { dw := *(*[]uintptr)(unsafe.Pointer(&dst)) aw := *(*[]uintptr)(unsafe.Pointer(&a)) bw := *(*[]uintptr)(unsafe.Pointer(&b)) n := len(b) / wordSize ex := n % 8 for i := 0; i < ex; i++ { dw[i] = aw[i] ^ bw[i] } for i := ex; i < n; i += 8 { _dw := dw[i : i+8] _aw := aw[i : i+8] _bw := bw[i : i+8] _dw[0] = _aw[0] ^ _bw[0] _dw[1] = _aw[1] ^ _bw[1] _dw[2] = _aw[2] ^ _bw[2] _dw[3] = _aw[3] ^ _bw[3] _dw[4] = _aw[4] ^ _bw[4] _dw[5] = _aw[5] ^ _bw[5] _dw[6] = _aw[6] ^ _bw[6] _dw[7] = _aw[7] ^ _bw[7] } } -- You received this message because you are subscribed to the Google Groups "golang-nuts" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. For more options, visit https://groups.google.com/d/optout.
