forked from quic-go/quic-go
wire: speed up parsing of headers with arbitrary length connection IDs (#4618)
This is significantly faster: name old time/op new time/op delta ArbitraryHeaderParsing/dest_8/_src_10-16 53.8ns ± 2% 27.4ns ± 2% -49.01% (p=0.008 n=5+5) ArbitraryHeaderParsing/dest_20_/_src_20-16 61.6ns ± 1% 33.3ns ± 3% -46.00% (p=0.008 n=5+5) ArbitraryHeaderParsing/dest_100_/_src_150-16 90.0ns ± 3% 54.8ns ± 5% -39.09% (p=0.008 n=5+5) name old alloc/op new alloc/op delta ArbitraryHeaderParsing/dest_8/_src_10-16 72.0B ± 0% 24.0B ± 0% -66.67% (p=0.008 n=5+5) ArbitraryHeaderParsing/dest_20_/_src_20-16 96.0B ± 0% 48.0B ± 0% -50.00% (p=0.008 n=5+5) ArbitraryHeaderParsing/dest_100_/_src_150-16 320B ± 0% 272B ± 0% -15.00% (p=0.008 n=5+5) name old allocs/op new allocs/op delta ArbitraryHeaderParsing/dest_8/_src_10-16 3.00 ± 0% 2.00 ± 0% -33.33% (p=0.008 n=5+5) ArbitraryHeaderParsing/dest_20_/_src_20-16 3.00 ± 0% 2.00 ± 0% -33.33% (p=0.008 n=5+5) ArbitraryHeaderParsing/dest_100_/_src_150-16 3.00 ± 0% 2.00 ± 0% -33.33% (p=0.008 n=5+5)
This commit is contained in:
@@ -575,3 +575,39 @@ func BenchmarkParseRetry(b *testing.B) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func BenchmarkArbitraryHeaderParsing(b *testing.B) {
|
||||
b.Run("dest 8/ src 10", func(b *testing.B) { benchmarkArbitraryHeaderParsing(b, 8, 10) })
|
||||
b.Run("dest 20 / src 20", func(b *testing.B) { benchmarkArbitraryHeaderParsing(b, 20, 20) })
|
||||
b.Run("dest 100 / src 150", func(b *testing.B) { benchmarkArbitraryHeaderParsing(b, 100, 150) })
|
||||
}
|
||||
|
||||
func benchmarkArbitraryHeaderParsing(b *testing.B, destLen, srcLen int) {
|
||||
destConnID := make([]byte, destLen)
|
||||
rand.Read(destConnID)
|
||||
srcConnID := make([]byte, srcLen)
|
||||
rand.Read(srcConnID)
|
||||
buf := []byte{0x80, 1, 2, 3, 4}
|
||||
buf = append(buf, uint8(destLen))
|
||||
buf = append(buf, destConnID...)
|
||||
buf = append(buf, uint8(srcLen))
|
||||
buf = append(buf, srcConnID...)
|
||||
|
||||
b.ResetTimer()
|
||||
b.ReportAllocs()
|
||||
for i := 0; i < b.N; i++ {
|
||||
parsed, d, s, err := ParseArbitraryLenConnectionIDs(buf)
|
||||
if err != nil {
|
||||
b.Fatal(err)
|
||||
}
|
||||
if parsed != len(buf) {
|
||||
b.Fatal("expected to parse entire slice")
|
||||
}
|
||||
if !bytes.Equal(destConnID, d.Bytes()) {
|
||||
b.Fatalf("destination connection IDs don't match: %v vs %v", destConnID, d.Bytes())
|
||||
}
|
||||
if !bytes.Equal(srcConnID, s.Bytes()) {
|
||||
b.Fatalf("source connection IDs don't match: %v vs %v", srcConnID, s.Bytes())
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user