summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorsmasher164 <aindurti@gmail.com>2019-08-20 23:11:22 -0400
committerEmmanuel Odeke <emm.odeke@gmail.com>2019-09-07 22:21:30 +0000
commit141b09726dcfc1fa9f04ee9e08e6fa4af00fa57b (patch)
treecc1826087426d739399c0eccd1030bc5ed3423c3 /src
parenta5025fdcde3f4f8442052eac902217f8c55ec3e4 (diff)
downloadgo-git-141b09726dcfc1fa9f04ee9e08e6fa4af00fa57b.tar.gz
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>
Diffstat (limited to 'src')
-rw-r--r--src/net/http/http_test.go26
-rw-r--r--src/net/http/request.go4
2 files changed, 27 insertions, 3 deletions
diff --git a/src/net/http/http_test.go b/src/net/http/http_test.go
index 8f466bb366..224b46c796 100644
--- a/src/net/http/http_test.go
+++ b/src/net/http/http_test.go
@@ -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")
+ }
+}
diff --git a/src/net/http/request.go b/src/net/http/request.go
index 6e113f1607..0b195a89a6 100644
--- a/src/net/http/request.go
+++ b/src/net/http/request.go
@@ -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...)
}
}