From 79bdab24e1ecceaadf619ec33a56cadb9760e5c7 Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Wed, 6 Nov 2019 18:08:07 +0100 Subject: [PATCH] Improve performance of buzhash MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ``` name old time/op new time/op delta Buzhash2/1K-4 610ns ± 4% 643ns ±16% ~ (p=0.421 n=8+10) Buzhash2/1M-4 1.25ms ± 5% 1.16ms ± 4% -7.31% (p=0.000 n=10+10) Buzhash2/16M-4 19.2ms ± 2% 17.5ms ± 2% -8.73% (p=0.000 n=9+9) Buzhash2/100M-4 117ms ± 1% 107ms ± 3% -8.26% (p=0.000 n=10+10) name old speed new speed delta Buzhash2/1K-4 1.68GB/s ± 4% 1.60GB/s ±14% ~ (p=0.408 n=8+10) Buzhash2/1M-4 842MB/s ± 5% 908MB/s ± 3% +7.86% (p=0.000 n=10+10) Buzhash2/16M-4 875MB/s ± 2% 959MB/s ± 2% +9.57% (p=0.000 n=9+9) Buzhash2/100M-4 897MB/s ± 1% 977MB/s ± 3% +9.02% (p=0.000 n=10+10) name old alloc/op new alloc/op delta Buzhash2/1K-4 1.17kB ± 1% 1.17kB ± 0% -0.50% (p=0.006 n=10+10) Buzhash2/1M-4 1.08MB ± 1% 1.07MB ± 0% ~ (p=0.739 n=10+10) Buzhash2/16M-4 17.1MB ± 0% 17.1MB ± 0% ~ (p=0.579 n=10+10) Buzhash2/100M-4 106MB ± 0% 106MB ± 0% -0.01% (p=0.000 n=9+7) name old allocs/op new allocs/op delta Buzhash2/1K-4 3.00 ± 0% 3.00 ± 0% ~ (all equal) Buzhash2/1M-4 8.00 ± 0% 8.00 ± 0% ~ (all equal) Buzhash2/16M-4 72.0 ± 0% 72.0 ± 0% ~ (all equal) Buzhash2/100M-4 406 ± 0% 406 ± 0% ~ (all equal) ``` License: MIT Signed-off-by: Jakub Sztandera --- buzhash.go | 26 +++++++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/buzhash.go b/buzhash.go index 54115d5..b3de95f 100644 --- a/buzhash.go +++ b/buzhash.go @@ -61,17 +61,33 @@ func (b *Buzhash) NextBytes() ([]byte, error) { var state uint32 = 0 + if buzMin > len(b.buf) { + panic("this is impossible") + } + for ; i < buzMin; i++ { state = bits.RotateLeft32(state, 1) state = state ^ bytehash[b.buf[i]] } - if b.n+n > len(b.buf) { - panic("this is impossible, but gives +9 to performance") - } + { + max := b.n + n - 32 - 1 - for ; state&buzMask != 0 && i < b.n+n; i++ { - state = bits.RotateLeft32(state, 1) ^ bytehash[b.buf[i-32]] ^ bytehash[b.buf[i]] + buf := b.buf + bufshf := b.buf[32:] + i = buzMin - 32 + _ = buf[max] + _ = bufshf[max] + + for ; i <= max; i++ { + if state&buzMask == 0 { + break + } + state = bits.RotateLeft32(state, 1) ^ + bytehash[buf[i]] ^ + bytehash[bufshf[i]] + } + i += 32 } res := make([]byte, i) -- GitLab