From: Brad Fitzpatrick Date: Mon, 28 May 2012 18:26:45 +0000 (-0700) Subject: net/http: avoid fmt.Fprintf in Header.WriteSubset X-Git-Tag: go1.1rc2~3097 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=0605c0c656cca4ae1cac464c423dda3d1ebecb4a;p=gostls13.git net/http: avoid fmt.Fprintf in Header.WriteSubset R=golang-dev, dsymonds, r CC=golang-dev https://golang.org/cl/6242062 --- diff --git a/src/pkg/net/http/header.go b/src/pkg/net/http/header.go index 95bfa14150..d584c799f9 100644 --- a/src/pkg/net/http/header.go +++ b/src/pkg/net/http/header.go @@ -5,7 +5,6 @@ package http import ( - "fmt" "io" "net/textproto" "sort" @@ -61,7 +60,7 @@ var headerNewlineToSpace = strings.NewReplacer("\n", " ", "\r", " ") func (h Header) WriteSubset(w io.Writer, exclude map[string]bool) error { keys := make([]string, 0, len(h)) for k := range h { - if exclude == nil || !exclude[k] { + if !exclude[k] { keys = append(keys, k) } } @@ -70,8 +69,10 @@ func (h Header) WriteSubset(w io.Writer, exclude map[string]bool) error { for _, v := range h[k] { v = headerNewlineToSpace.Replace(v) v = strings.TrimSpace(v) - if _, err := fmt.Fprintf(w, "%s: %s\r\n", k, v); err != nil { - return err + for _, s := range []string{k, ": ", v, "\r\n"} { + if _, err := io.WriteString(w, s); err != nil { + return err + } } } } diff --git a/src/pkg/net/http/header_test.go b/src/pkg/net/http/header_test.go index fee5756b77..41e927f0eb 100644 --- a/src/pkg/net/http/header_test.go +++ b/src/pkg/net/http/header_test.go @@ -122,3 +122,17 @@ func TestHasToken(t *testing.T) { } } } + +func BenchmarkHeaderWriteSubset(b *testing.B) { + h := Header(map[string][]string{ + "Content-Length": {"123"}, + "Content-Type": {"text/plain"}, + "Date": {"some date at some time Z"}, + "Server": {"Go http package"}, + }) + var buf bytes.Buffer + for i := 0; i < b.N; i++ { + buf.Reset() + h.WriteSubset(&buf, nil) + } +}