aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrad Fitzpatrick <bradfitz@golang.org>2011-04-27 21:36:11 -0700
committerBrad Fitzpatrick <bradfitz@golang.org>2011-04-27 21:36:11 -0700
commitba43be30c4786c52c12a290fe397b83bdc558cfc (patch)
tree9fb21b7f7f9ea3eb3dd52e3d8da8c5f87e0244e8
parent37b3494026882711eb2f8b817e1dbda612700fe6 (diff)
downloadgo-ba43be30c4786c52c12a290fe397b83bdc558cfc.tar.gz
go-ba43be30c4786c52c12a290fe397b83bdc558cfc.zip
adler32: speed up ~40% by avoiding bounds checks
before & after: adler32.BenchmarkGolden 100000 14747 ns/op adler32.BenchmarkGolden 200000 8761 ns/op Found by profiling PNG encoding. R=rsc, bradfitzwork, eds CC=golang-dev https://golang.org/cl/4441073
-rw-r--r--src/pkg/hash/adler32/adler32.go4
-rw-r--r--src/pkg/hash/adler32/adler32_test.go14
2 files changed, 16 insertions, 2 deletions
diff --git a/src/pkg/hash/adler32/adler32.go b/src/pkg/hash/adler32/adler32.go
index f13a937933..84943d9ae4 100644
--- a/src/pkg/hash/adler32/adler32.go
+++ b/src/pkg/hash/adler32/adler32.go
@@ -43,8 +43,8 @@ func (d *digest) Size() int { return Size }
// Add p to the running checksum a, b.
func update(a, b uint32, p []byte) (aa, bb uint32) {
- for i := 0; i < len(p); i++ {
- a += uint32(p[i])
+ for _, pi := range p {
+ a += uint32(pi)
b += a
// invariant: a <= b
if b > (0xffffffff-255)/2 {
diff --git a/src/pkg/hash/adler32/adler32_test.go b/src/pkg/hash/adler32/adler32_test.go
index ffa5569bcd..01f931c685 100644
--- a/src/pkg/hash/adler32/adler32_test.go
+++ b/src/pkg/hash/adler32/adler32_test.go
@@ -5,6 +5,7 @@
package adler32
import (
+ "bytes"
"io"
"testing"
)
@@ -61,3 +62,16 @@ func TestGolden(t *testing.T) {
}
}
}
+
+func BenchmarkGolden(b *testing.B) {
+ b.StopTimer()
+ c := New()
+ var buf bytes.Buffer
+ for _, g := range golden {
+ buf.Write([]byte(g.in))
+ }
+ b.StartTimer()
+ for i := 0; i < b.N; i++ {
+ c.Write(buf.Bytes())
+ }
+}