forked from quic-go/quic-go
wire: optimize parsing logic for STREAM, DATAGRAM and ACK frames (#5227)
ParseOtherFrames-16 148ns ± 4% 150ns ± 3% ~ (p=0.223 n=8+8) ParseAckFrame-16 302ns ± 2% 298ns ± 3% ~ (p=0.246 n=8+8) ParseStreamFrame-16 262ns ± 3% 213ns ± 2% -18.61% (p=0.000 n=8+8) ParseDatagramFrame-16 561ns ± 5% 547ns ± 4% ~ (p=0.105 n=8+8)
This commit is contained in:
@@ -2,6 +2,19 @@ package ackhandler
|
||||
|
||||
import "github.com/quic-go/quic-go/internal/wire"
|
||||
|
||||
// IsFrameTypeAckEliciting returns true if the frame is ack-eliciting.
|
||||
func IsFrameTypeAckEliciting(t wire.FrameType) bool {
|
||||
//nolint:exhaustive // The default case catches the rest.
|
||||
switch t {
|
||||
case wire.FrameTypeAck, wire.FrameTypeAckECN:
|
||||
return false
|
||||
case wire.FrameTypeConnectionClose, wire.FrameTypeApplicationClose:
|
||||
return false
|
||||
default:
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
||||
// IsFrameAckEliciting returns true if the frame is ack-eliciting.
|
||||
func IsFrameAckEliciting(f wire.Frame) bool {
|
||||
_, isAck := f.(*wire.AckFrame)
|
||||
|
||||
@@ -7,6 +7,48 @@ import (
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
func TestIsFrameTypeAckEliciting(t *testing.T) {
|
||||
testCases := map[wire.FrameType]bool{
|
||||
wire.FrameTypePing: true,
|
||||
wire.FrameTypeAck: false,
|
||||
wire.FrameTypeAckECN: false,
|
||||
wire.FrameTypeResetStream: true,
|
||||
wire.FrameTypeStopSending: true,
|
||||
wire.FrameTypeCrypto: true,
|
||||
wire.FrameTypeNewToken: true,
|
||||
wire.FrameType(0x08): true,
|
||||
wire.FrameType(0x09): true,
|
||||
wire.FrameType(0x0a): true,
|
||||
wire.FrameType(0x0b): true,
|
||||
wire.FrameType(0x0c): true,
|
||||
wire.FrameType(0x0d): true,
|
||||
wire.FrameType(0x0e): true,
|
||||
wire.FrameType(0x0f): true,
|
||||
wire.FrameTypeMaxData: true,
|
||||
wire.FrameTypeMaxStreamData: true,
|
||||
wire.FrameTypeBidiMaxStreams: true,
|
||||
wire.FrameTypeUniMaxStreams: true,
|
||||
wire.FrameTypeDataBlocked: true,
|
||||
wire.FrameTypeStreamDataBlocked: true,
|
||||
wire.FrameTypeBidiStreamBlocked: true,
|
||||
wire.FrameTypeUniStreamBlocked: true,
|
||||
wire.FrameTypeNewConnectionID: true,
|
||||
wire.FrameTypeRetireConnectionID: true,
|
||||
wire.FrameTypePathChallenge: true,
|
||||
wire.FrameTypePathResponse: true,
|
||||
wire.FrameTypeConnectionClose: false,
|
||||
wire.FrameTypeApplicationClose: false,
|
||||
wire.FrameTypeHandshakeDone: true,
|
||||
wire.FrameTypeResetStreamAt: true,
|
||||
wire.FrameTypeDatagramNoLength: true,
|
||||
wire.FrameTypeDatagramWithLength: true,
|
||||
}
|
||||
|
||||
for ft, expected := range testCases {
|
||||
require.Equal(t, expected, IsFrameTypeAckEliciting(ft), "unexpected result for frame type 0x%x", ft)
|
||||
}
|
||||
}
|
||||
|
||||
func TestAckElicitingFrames(t *testing.T) {
|
||||
testCases := map[wire.Frame]bool{
|
||||
&wire.AckFrame{}: false,
|
||||
|
||||
Reference in New Issue
Block a user