Last active
March 26, 2025 12:13
-
-
Save gaby/5a390339b759f59284d26be11db4a532 to your computer and use it in GitHub Desktop.
Golang net/http benchmarks
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package benchmark | |
import ( | |
"net/http" | |
"testing" | |
) | |
// nopResponseWriter is a minimal implementation of http.ResponseWriter that does nothing. | |
type nopResponseWriter struct{} | |
func (n *nopResponseWriter) Header() http.Header { | |
return http.Header{} | |
} | |
func (n *nopResponseWriter) Write(b []byte) (int, error) { | |
return len(b), nil | |
} | |
func (n *nopResponseWriter) WriteHeader(statusCode int) {} | |
// Benchmark_Router_Next_Default benchmarks the sequential handling of a pre-created request. | |
func Benchmark_Router_Next_Default_NetHTTP(b *testing.B) { | |
// Create a new ServeMux and register a no-op handler for the "/" route. | |
mux := http.NewServeMux() | |
mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { | |
// no-op handler | |
}) | |
handler := http.Handler(mux) | |
// Pre-create a base request and response writer. | |
req, _ := http.NewRequest(http.MethodGet, "/", nil) | |
nrw := &nopResponseWriter{} | |
b.ReportAllocs() | |
b.ResetTimer() | |
for i := 0; i < b.N; i++ { | |
handler.ServeHTTP(nrw, req) | |
} | |
} | |
// Benchmark_Router_Next_Default_Parallel benchmarks handling in parallel. | |
func Benchmark_Router_Next_Default_Parallel_NetHTTP(b *testing.B) { | |
mux := http.NewServeMux() | |
mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { | |
// no-op handler | |
}) | |
handler := http.Handler(mux) | |
b.ReportAllocs() | |
b.ResetTimer() | |
b.RunParallel(func(pb *testing.PB) { | |
// Create a new request for each parallel worker. | |
req, _ := http.NewRequest(http.MethodGet, "/", nil) | |
nrw := &nopResponseWriter{} | |
for pb.Next() { | |
// Create a new response writer for each call to avoid data races. | |
handler.ServeHTTP(nrw, req) | |
} | |
}) | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment