Files
go-omni/httpc/benchmark_test.go

101 lines
2.7 KiB
Go

package httpc
import (
"context"
"io"
"net/http"
"net/http/httptest"
"strings"
"testing"
)
type benchmarkTransport struct {
payload string
status int
}
func (t benchmarkTransport) RoundTrip(r *http.Request) (*http.Response, error) {
if r.Body != nil {
_ = r.Body.Close()
}
return &http.Response{StatusCode: t.status, Header: make(http.Header), Body: io.NopCloser(strings.NewReader(t.payload)), ContentLength: int64(len(t.payload)), Request: r}, nil
}
func BenchmarkHTTPClient(b *testing.B) {
for _, size := range []int{128, 4096, 65536} {
for _, discard := range []bool{false, true} {
label := map[int]string{128: "128B", 4096: "4KiB", 65536: "64KiB"}[size]
if discard {
label += "/discard"
} else {
label += "/decode"
}
b.Run(label, func(b *testing.B) {
c, err := New(Config{Transport: benchmarkTransport{`{"value":"` + strings.Repeat("x", size) + `"}`, 200}, DisableLogging: true})
if err != nil {
b.Fatal(err)
}
defer c.Close()
var output struct {
Value string `json:"value"`
}
var target any = &output
if discard {
target = nil
}
b.ReportAllocs()
b.ResetTimer()
for i := 0; i < b.N; i++ {
if err := c.JSON(context.Background(), "GET", "http://example.invalid/item", nil, target); err != nil {
b.Fatal(err)
}
}
})
}
}
b.Run("Do", func(b *testing.B) {
c, _ := New(Config{Transport: benchmarkTransport{"", 200}, DisableLogging: true})
defer c.Close()
r, _ := http.NewRequest("GET", "http://example.invalid/item", nil)
b.ReportAllocs()
b.ResetTimer()
for i := 0; i < b.N; i++ {
res, err := c.Do(r)
if err != nil {
b.Fatal(err)
}
res.Body.Close()
}
})
}
func BenchmarkHTTPPool(b *testing.B) {
for _, status := range []int{200, 401} {
b.Run(http.StatusText(status), func(b *testing.B) {
s := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(status); io.WriteString(w, `{"ok":true}`) }))
defer s.Close()
c, _ := New(Config{DisableLogging: true})
defer c.Close()
b.ReportAllocs()
b.ResetTimer()
for i := 0; i < b.N; i++ {
err := c.JSON(context.Background(), "GET", s.URL, nil, nil)
if status == 200 && err != nil {
b.Fatal(err)
}
}
})
}
}
func BenchmarkHTTPHeaders(b *testing.B) {
c, _ := New(Config{Transport: benchmarkTransport{`{"ok":true}`, 200}, DisableLogging: true})
defer c.Close()
option := WithHeaders(http.Header{"Authorization": []string{"Bearer example"}, "X-Request-Id": []string{"example-request"}})
b.ReportAllocs()
b.ResetTimer()
for i := 0; i < b.N; i++ {
if err := c.JSON(context.Background(), "GET", "http://example.invalid", nil, nil, option); err != nil {
b.Fatal(err)
}
}
}