mirror of https://github.com/golang/go.git
net/http: make copyValues append instead of calling Add
This results in a performance boost: name old time/op new time/op delta CopyValues-4 3.46µs ± 3% 1.53µs ± 3% -55.85% (p=0.000 n=18+19) name old alloc/op new alloc/op delta CopyValues-4 1.52kB ± 0% 0.74kB ± 0% -51.58% (p=0.000 n=20+20) name old allocs/op new allocs/op delta CopyValues-4 24.0 ± 0% 11.0 ± 0% -54.17% (p=0.000 n=20+20) Fixes #33744. Change-Id: Ibc653fb076a9a6aaa775fcc9ca720fb90e68cf96 Reviewed-on: https://go-review.googlesource.com/c/go/+/191057 Run-TryBot: Emmanuel Odeke <emm.odeke@gmail.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Emmanuel Odeke <emm.odeke@gmail.com>
This commit is contained in:
parent
a5025fdcde
commit
141b09726d
|
|
@ -9,6 +9,7 @@ package http
|
|||
import (
|
||||
"bytes"
|
||||
"internal/testenv"
|
||||
"net/url"
|
||||
"os/exec"
|
||||
"reflect"
|
||||
"testing"
|
||||
|
|
@ -109,3 +110,28 @@ func TestCmdGoNoHTTPServer(t *testing.T) {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
var valuesCount int
|
||||
|
||||
func BenchmarkCopyValues(b *testing.B) {
|
||||
b.ReportAllocs()
|
||||
src := url.Values{
|
||||
"a": {"1", "2", "3", "4", "5"},
|
||||
"b": {"2", "2", "3", "4", "5"},
|
||||
"c": {"3", "2", "3", "4", "5"},
|
||||
"d": {"4", "2", "3", "4", "5"},
|
||||
"e": {"1", "1", "2", "3", "4", "5", "6", "7", "abcdef", "l", "a", "b", "c", "d", "z"},
|
||||
"j": {"1", "2"},
|
||||
"m": nil,
|
||||
}
|
||||
for i := 0; i < b.N; i++ {
|
||||
dst := url.Values{"a": {"b"}, "b": {"2"}, "c": {"3"}, "d": {"4"}, "j": nil, "m": {"x"}}
|
||||
copyValues(dst, src)
|
||||
if valuesCount = len(dst["a"]); valuesCount != 6 {
|
||||
b.Fatalf(`%d items in dst["a"] but expected 6`, valuesCount)
|
||||
}
|
||||
}
|
||||
if valuesCount == 0 {
|
||||
b.Fatal("Benchmark wasn't run")
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1165,9 +1165,7 @@ func (l *maxBytesReader) Close() error {
|
|||
|
||||
func copyValues(dst, src url.Values) {
|
||||
for k, vs := range src {
|
||||
for _, value := range vs {
|
||||
dst.Add(k, value)
|
||||
}
|
||||
dst[k] = append(dst[k], vs...)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue