From: Joel Sing Date: Sun, 5 Jan 2014 14:34:56 +0000 (+1100) Subject: crypto/sha1, crypto/sha256, crypto/sha512: use copy for partial block X-Git-Tag: go1.3beta1~1058 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=29fe067ba7257bcfa7b1a15304592997b0d3c294;p=gostls13.git crypto/sha1, crypto/sha256, crypto/sha512: use copy for partial block Use copy rather than a hand rolled loop when moving a partial input block to the scratch area. This results in a reasonable performance gain when partial blocks are written. Benchmarks on Intel(R) Xeon(R) CPU X5650 @ 2.67GHz with Go amd64: benchmark old MB/s new MB/s speedup SHA1 BenchmarkHash8Bytes 18.37 22.80 1.24x SHA256 BenchmarkHash8Bytes 11.86 13.78 1.16x SHA512 BenchmarkHash8Bytes 4.51 5.24 1.16x benchmark old ns/op new ns/op delta SHA1 BenchmarkHash8Bytes 435 350 -19.54% SHA256 BenchmarkHash8Bytes 674 580 -13.95% SHA512 BenchmarkHash8Bytes 1772 1526 -13.88% R=agl, dave, bradfitz CC=golang-codereviews https://golang.org/cl/35840044 --- diff --git a/src/pkg/crypto/sha1/sha1.go b/src/pkg/crypto/sha1/sha1.go index 8eb3f7a798..9f1a96e364 100644 --- a/src/pkg/crypto/sha1/sha1.go +++ b/src/pkg/crypto/sha1/sha1.go @@ -62,16 +62,10 @@ func (d *digest) Write(p []byte) (nn int, err error) { nn = len(p) d.len += uint64(nn) if d.nx > 0 { - n := len(p) - if n > chunk-d.nx { - n = chunk - d.nx - } - for i := 0; i < n; i++ { - d.x[d.nx+i] = p[i] - } + n := copy(d.x[d.nx:], p) d.nx += n if d.nx == chunk { - block(d, d.x[0:]) + block(d, d.x[:]) d.nx = 0 } p = p[n:] diff --git a/src/pkg/crypto/sha256/sha256.go b/src/pkg/crypto/sha256/sha256.go index 89628a1b75..d84cebf2ff 100644 --- a/src/pkg/crypto/sha256/sha256.go +++ b/src/pkg/crypto/sha256/sha256.go @@ -106,16 +106,10 @@ func (d *digest) Write(p []byte) (nn int, err error) { nn = len(p) d.len += uint64(nn) if d.nx > 0 { - n := len(p) - if n > chunk-d.nx { - n = chunk - d.nx - } - for i := 0; i < n; i++ { - d.x[d.nx+i] = p[i] - } + n := copy(d.x[d.nx:], p) d.nx += n if d.nx == chunk { - block(d, d.x[0:]) + block(d, d.x[:]) d.nx = 0 } p = p[n:] diff --git a/src/pkg/crypto/sha512/sha512.go b/src/pkg/crypto/sha512/sha512.go index d2ada51373..bca7a91e22 100644 --- a/src/pkg/crypto/sha512/sha512.go +++ b/src/pkg/crypto/sha512/sha512.go @@ -106,16 +106,10 @@ func (d *digest) Write(p []byte) (nn int, err error) { nn = len(p) d.len += uint64(nn) if d.nx > 0 { - n := len(p) - if n > chunk-d.nx { - n = chunk - d.nx - } - for i := 0; i < n; i++ { - d.x[d.nx+i] = p[i] - } + n := copy(d.x[d.nx:], p) d.nx += n if d.nx == chunk { - block(d, d.x[0:]) + block(d, d.x[:]) d.nx = 0 } p = p[n:]