aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorBrad Fitzpatrick <bradfitz@golang.org>2018-06-05 21:06:17 +0000
committerBrad Fitzpatrick <bradfitz@golang.org>2018-06-06 01:47:31 +0000
commit2ce295e9542c104110a050bf809dd0a37e191eb7 (patch)
treee4708bd69c995300c4ead215d4bca14d196e13a9 /src
parentebb8a1f8e6bf14ce4773e930870985571aaff932 (diff)
downloadgo-2ce295e9542c104110a050bf809dd0a37e191eb7.tar.xz
net/http: remove an allocation in ServeMux
Also, add a benchmark variant ("SkipServe") that only benchmarks the ServeMux handler selection path. name old time/op new time/op delta ServeMux_SkipServe-4 74.2µs ± 2% 60.6µs ± 1% -18.31% (p=0.000 n=10+9) name old alloc/op new alloc/op delta ServeMux_SkipServe-4 2.62kB ± 0% 0.00kB ±NaN% -100.00% (p=0.000 n=10+10) name old allocs/op new allocs/op delta ServeMux_SkipServe-4 180 ± 0% 0 ±NaN% -100.00% (p=0.000 n=10+10) Updates #25383 Change-Id: Icfbb3b977e309093d032e922d1b4f254df6f5955 Reviewed-on: https://go-review.googlesource.com/116378 Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org> 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/serve_test.go13
-rw-r--r--src/net/http/server.go7
2 files changed, 14 insertions, 6 deletions
diff --git a/src/net/http/serve_test.go b/src/net/http/serve_test.go
index c14d87dcf9..10651fff7c 100644
--- a/src/net/http/serve_test.go
+++ b/src/net/http/serve_test.go
@@ -608,8 +608,9 @@ func TestShouldRedirectConcurrency(t *testing.T) {
mux.HandleFunc("/", func(w ResponseWriter, r *Request) {})
}
-func BenchmarkServeMux(b *testing.B) {
-
+func BenchmarkServeMux(b *testing.B) { benchmarkServeMux(b, true) }
+func BenchmarkServeMux_SkipServe(b *testing.B) { benchmarkServeMux(b, false) }
+func benchmarkServeMux(b *testing.B, runHandler bool) {
type test struct {
path string
code int
@@ -641,9 +642,11 @@ func BenchmarkServeMux(b *testing.B) {
for _, tt := range tests {
*rw = httptest.ResponseRecorder{}
h, pattern := mux.Handler(tt.req)
- h.ServeHTTP(rw, tt.req)
- if pattern != tt.path || rw.Code != tt.code {
- b.Fatalf("got %d, %q, want %d, %q", rw.Code, pattern, tt.code, tt.path)
+ if runHandler {
+ h.ServeHTTP(rw, tt.req)
+ if pattern != tt.path || rw.Code != tt.code {
+ b.Fatalf("got %d, %q, want %d, %q", rw.Code, pattern, tt.code, tt.path)
+ }
}
}
}
diff --git a/src/net/http/server.go b/src/net/http/server.go
index 0ac7c96de7..407546d6c9 100644
--- a/src/net/http/server.go
+++ b/src/net/http/server.go
@@ -2182,7 +2182,12 @@ func cleanPath(p string) string {
// path.Clean removes trailing slash except for root;
// put the trailing slash back if necessary.
if p[len(p)-1] == '/' && np != "/" {
- np += "/"
+ // Fast path for common case of p being the string we want:
+ if len(p) == len(np)+1 && strings.HasPrefix(p, np) {
+ np = p
+ } else {
+ np += "/"
+ }
}
return np
}