mirror of
https://github.com/infinite-iroha/touka.git
synced 2026-06-13 15:47:38 +08:00
perf: reuse reverse proxy copy buffers
This commit is contained in:
parent
efa1e3fb3f
commit
71a344a3de
4 changed files with 282 additions and 3 deletions
59
ecw_benchmark_test.go
Normal file
59
ecw_benchmark_test.go
Normal file
|
|
@ -0,0 +1,59 @@
|
|||
package touka
|
||||
|
||||
import (
|
||||
"net/http"
|
||||
"net/http/httptest"
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestErrorCapturingResponseWriterResetClearsHeaderSnapshot(t *testing.T) {
|
||||
c, _ := CreateTestContext(nil)
|
||||
ecw := AcquireErrorCapturingResponseWriter(c)
|
||||
defer ReleaseErrorCapturingResponseWriter(ecw)
|
||||
|
||||
ecw.capturedErrorSignal = true
|
||||
ecw.Header().Set("Content-Type", "text/plain")
|
||||
ecw.Header().Add("X-Test", "one")
|
||||
|
||||
req, err := http.NewRequest(http.MethodGet, "/", nil)
|
||||
if err != nil {
|
||||
t.Fatalf("failed to build request: %v", err)
|
||||
}
|
||||
|
||||
ecw.reset(httptest.NewRecorder(), req, c, c.engine.errorHandle.handler)
|
||||
|
||||
if len(ecw.headerSnapshot) != 0 {
|
||||
t.Fatalf("expected header snapshot to be empty after reset, got %#v", ecw.headerSnapshot)
|
||||
}
|
||||
}
|
||||
|
||||
func BenchmarkErrorCapturingResponseWriterReset(b *testing.B) {
|
||||
c, _ := CreateTestContext(nil)
|
||||
ecw := AcquireErrorCapturingResponseWriter(c)
|
||||
defer ReleaseErrorCapturingResponseWriter(ecw)
|
||||
|
||||
rawWriter := httptest.NewRecorder()
|
||||
req, err := http.NewRequest(http.MethodGet, "/", nil)
|
||||
if err != nil {
|
||||
b.Fatalf("failed to build request: %v", err)
|
||||
}
|
||||
|
||||
keys := make([]string, 16)
|
||||
for i := range keys {
|
||||
keys[i] = http.CanonicalHeaderKey("X-Test-" + string(rune('A'+i)))
|
||||
}
|
||||
values := []string{"one", "two", "three"}
|
||||
for _, key := range keys {
|
||||
ecw.headerSnapshot[key] = values
|
||||
}
|
||||
|
||||
b.ReportAllocs()
|
||||
b.ResetTimer()
|
||||
|
||||
for i := 0; i < b.N; i++ {
|
||||
ecw.reset(rawWriter, req, c, c.engine.errorHandle.handler)
|
||||
for _, key := range keys {
|
||||
ecw.headerSnapshot[key] = values
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue