From 89a1f02834f1472cf307b222e14884ebd41086d3 Mon Sep 17 00:00:00 2001 From: Ilya Tocar Date: Tue, 12 Apr 2016 18:14:45 +0300 Subject: [PATCH] hash/adler32: Unroll loop for extra performance. MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit name old time/op new time/op delta Adler32KB-4 592ns ± 0% 447ns ± 0% -24.49% (p=0.000 n=19+20) name old speed new speed delta Adler32KB-4 1.73GB/s ± 0% 2.29GB/s ± 0% +32.41% (p=0.000 n=20+20) Change-Id: I38990aa66ca4452a886200018a57c0bc3af30717 Reviewed-on: https://go-review.googlesource.com/21880 Reviewed-by: Keith Randall Run-TryBot: Ilya Tocar TryBot-Result: Gobot Gobot --- src/hash/adler32/adler32.go | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/hash/adler32/adler32.go b/src/hash/adler32/adler32.go index 0c733f751a..21d6a2e1dc 100644 --- a/src/hash/adler32/adler32.go +++ b/src/hash/adler32/adler32.go @@ -42,7 +42,7 @@ func New() hash.Hash32 { func (d *digest) Size() int { return Size } -func (d *digest) BlockSize() int { return 1 } +func (d *digest) BlockSize() int { return 4 } // Add p to the running checksum d. func update(d digest, p []byte) digest { @@ -52,6 +52,17 @@ func update(d digest, p []byte) digest { if len(p) > nmax { p, q = p[:nmax], p[nmax:] } + for len(p) >= 4 { + s1 += uint32(p[0]) + s2 += s1 + s1 += uint32(p[1]) + s2 += s1 + s1 += uint32(p[2]) + s2 += s1 + s1 += uint32(p[3]) + s2 += s1 + p = p[4:] + } for _, x := range p { s1 += uint32(x) s2 += s1 -- 2.48.1