aboutsummaryrefslogtreecommitdiff
path: root/header_timing_test.go
diff options
context:
space:
mode:
authorGravatar Sergey Ponomarev <stokito@gmail.com> 2022-06-06 09:46:49 +0300
committerGravatar GitHub <noreply@github.com> 2022-06-06 08:46:49 +0200
commit66cd5022fdfb02e619e1b556d1e55fe1f42dac90 (patch)
tree83a59d3c2e0b1503e1220b17e05f84fc6904fe7f /header_timing_test.go
parentResponse.ContentEncoding(): store as field and avoid using Header.SetCanonica... (diff)
downloadfasthttp-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.go46
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)
}