aboutsummaryrefslogtreecommitdiff
path: root/src/hash
diff options
context:
space:
mode:
authorIlya Tocar <ilya.tocar@intel.com>2016-04-12 18:14:45 +0300
committerIlya Tocar <ilya.tocar@intel.com>2016-04-15 10:17:17 +0000
commit89a1f02834f1472cf307b222e14884ebd41086d3 (patch)
tree61d3d2c35ca08dfd44445634bc23aab5efa27a6f /src/hash
parent8955745bfb9a3682e78b71fb8cb343abc4bd72a6 (diff)
downloadgo-89a1f02834f1472cf307b222e14884ebd41086d3.tar.gz
go-89a1f02834f1472cf307b222e14884ebd41086d3.zip
hash/adler32: Unroll loop for extra performance.
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 <khr@golang.org> Run-TryBot: Ilya Tocar <ilya.tocar@intel.com> TryBot-Result: Gobot Gobot <gobot@golang.org>
Diffstat (limited to 'src/hash')
-rw-r--r--src/hash/adler32/adler32.go13
1 files changed, 12 insertions, 1 deletions
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