diff options
author | Sergey Ponomarev <stokito@gmail.com> | 2022-06-06 09:46:49 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-06-06 08:46:49 +0200 |
commit | 66cd5022fdfb02e619e1b556d1e55fe1f42dac90 (patch) | |
tree | 83a59d3c2e0b1503e1220b17e05f84fc6904fe7f /header_timing_test.go | |
parent | Response.ContentEncoding(): store as field and avoid using Header.SetCanonica... (diff) | |
download | fasthttp-66cd5022fdfb02e619e1b556d1e55fe1f42dac90.tar.gz fasthttp-66cd5022fdfb02e619e1b556d1e55fe1f42dac90.tar.bz2 fasthttp-66cd5022fdfb02e619e1b556d1e55fe1f42dac90.zip |
header.go Referer() optimize (#1313)
* args.go GetBool(): use switch with string casting
This should be optimized by Go compiler itself so the b2s() call is not needed.
It was previously done by this but changed in
1e7885eb56cdf4c6f550e143b0dbd3acc82a4137
* header.go Referer() optimize
Use direct peekArgBytes() instead of PeekBytes() that will check for special headers
* header_timing_test.go BenchmarkRequestHeaderPeekBytesSpecialHeader
The old BenchmarkRequestHeaderPeekBytesCanonical and BenchmarkRequestHeaderPeekBytesNonCanonical are in fact just measured the header normalization.
But it's anyway is benchmarked separately.
Results was almost the same: 1.5 ns/op.
Instead, let's reuse the benches to find a difference between peeking of special (Host, CT) and custom headers.
Diffstat (limited to 'header_timing_test.go')
-rw-r--r-- | header_timing_test.go | 46 |
1 files changed, 39 insertions, 7 deletions
diff --git a/header_timing_test.go b/header_timing_test.go index 0d7ab67..81ff7fb 100644 --- a/header_timing_test.go +++ b/header_timing_test.go @@ -12,6 +12,9 @@ import ( var strFoobar = []byte("foobar.com") +// it has the same length as Content-Type +var strNonSpecialHeader = []byte("Dontent-Type") + type benchReadBuf struct { s []byte n int @@ -96,12 +99,13 @@ func BenchmarkResponseHeaderWrite(b *testing.B) { }) } -func BenchmarkRequestHeaderPeekBytesCanonical(b *testing.B) { +// Result: 2.2 ns/op +func BenchmarkRequestHeaderPeekBytesSpecialHeader(b *testing.B) { b.RunParallel(func(pb *testing.PB) { var h RequestHeader - h.SetBytesV("Host", strFoobar) + h.SetContentTypeBytes(strFoobar) for pb.Next() { - v := h.PeekBytes(strHost) + v := h.PeekBytes(strContentType) if !bytes.Equal(v, strFoobar) { b.Fatalf("unexpected result: %q. Expected %q", v, strFoobar) } @@ -109,13 +113,41 @@ func BenchmarkRequestHeaderPeekBytesCanonical(b *testing.B) { }) } -func BenchmarkRequestHeaderPeekBytesNonCanonical(b *testing.B) { +// Result: 2.9 ns/op +func BenchmarkRequestHeaderPeekBytesNonSpecialHeader(b *testing.B) { b.RunParallel(func(pb *testing.PB) { var h RequestHeader - h.SetBytesV("Host", strFoobar) - hostBytes := []byte("HOST") + h.SetBytesKV(strNonSpecialHeader, strFoobar) + for pb.Next() { + v := h.PeekBytes(strNonSpecialHeader) + if !bytes.Equal(v, strFoobar) { + b.Fatalf("unexpected result: %q. Expected %q", v, strFoobar) + } + } + }) +} + +// Result: 2.3 ns/op +func BenchmarkResponseHeaderPeekBytesSpecialHeader(b *testing.B) { + b.RunParallel(func(pb *testing.PB) { + var h ResponseHeader + h.SetContentTypeBytes(strFoobar) + for pb.Next() { + v := h.PeekBytes(strContentType) + if !bytes.Equal(v, strFoobar) { + b.Fatalf("unexpected result: %q. Expected %q", v, strFoobar) + } + } + }) +} + +// Result: 2.9 ns/op +func BenchmarkResponseHeaderPeekBytesNonSpecialHeader(b *testing.B) { + b.RunParallel(func(pb *testing.PB) { + var h ResponseHeader + h.SetBytesKV(strNonSpecialHeader, strFoobar) for pb.Next() { - v := h.PeekBytes(hostBytes) + v := h.PeekBytes(strNonSpecialHeader) if !bytes.Equal(v, strFoobar) { b.Fatalf("unexpected result: %q. Expected %q", v, strFoobar) } |