Ok, at my computer now so time for a longer answer.

What you want is this:
https://play.golang.org/p/QirBtj523Wu

Now, what's wrong with the code you sent? Quite a few things actually.
Maybe you should start with the code shared above and then work through
what it is doing, then compare that with the original alternatives.

Michael

On Mon, Mar 18, 2019 at 9:58 PM Michael Jones <michael.jo...@gmail.com>
wrote:

> n%8 is not what you want.
>
> n - n%8 is what you want, best expressed as n &^0x7
>
> On Mon, Mar 18, 2019 at 7:36 PM zhou yu <yuzhou....@gmail.com> wrote:
>
>> *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 golang-nuts+unsubscr...@googlegroups.com.
>> For more options, visit https://groups.google.com/d/optout.
>>
>
>
> --
>
> *Michael T. jonesmichael.jo...@gmail.com <michael.jo...@gmail.com>*
>


-- 

*Michael T. jonesmichael.jo...@gmail.com <michael.jo...@gmail.com>*

-- 
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 golang-nuts+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to