forked from quic-go/quic-go
ackhandler: add a benchmark for sending and acknowledging packets (#5333)
* ackhandler: add a benchmark for sending and acknowledging packets * report allocs, improve benchmark names
This commit is contained in:
@@ -61,13 +61,16 @@ func (h *sentPacketHandler) getBytesInFlight() protocol.ByteCount {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func ackRanges(pns ...protocol.PacketNumber) []wire.AckRange {
|
func ackRanges(pns ...protocol.PacketNumber) []wire.AckRange {
|
||||||
|
return appendAckRanges(nil, pns...)
|
||||||
|
}
|
||||||
|
|
||||||
|
func appendAckRanges(ranges []wire.AckRange, pns ...protocol.PacketNumber) []wire.AckRange {
|
||||||
if len(pns) == 0 {
|
if len(pns) == 0 {
|
||||||
return nil
|
return ranges
|
||||||
}
|
}
|
||||||
slices.Sort(pns)
|
slices.Sort(pns)
|
||||||
slices.Reverse(pns)
|
slices.Reverse(pns)
|
||||||
|
|
||||||
var ranges []wire.AckRange
|
|
||||||
start := pns[0]
|
start := pns[0]
|
||||||
for i := 1; i < len(pns); i++ {
|
for i := 1; i < len(pns); i++ {
|
||||||
if pns[i-1]-pns[i] > 1 {
|
if pns[i-1]-pns[i] > 1 {
|
||||||
@@ -1339,3 +1342,69 @@ func testSentPacketHandlerRandomized(t *testing.T, seed uint64) {
|
|||||||
t.Logf("t=%dms: loss detection timeout (lost: %v)", now.Sub(start).Milliseconds(), packets.Lost)
|
t.Logf("t=%dms: loss detection timeout (lost: %v)", now.Sub(start).Milliseconds(), packets.Lost)
|
||||||
sph.OnLossDetectionTimeout(now)
|
sph.OnLossDetectionTimeout(now)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func BenchmarkSendAndAcknowledge(b *testing.B) {
|
||||||
|
b.Run("ack every: 2, in flight: 0", func(b *testing.B) {
|
||||||
|
benchmarkSendAndAcknowledge(b, 2, 0)
|
||||||
|
})
|
||||||
|
b.Run("ack every: 10, in flight: 100", func(b *testing.B) {
|
||||||
|
benchmarkSendAndAcknowledge(b, 10, 100)
|
||||||
|
})
|
||||||
|
b.Run("ack every: 100, in flight: 1000", func(b *testing.B) {
|
||||||
|
benchmarkSendAndAcknowledge(b, 100, 1000)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func benchmarkSendAndAcknowledge(b *testing.B, ackEvery, inFlight int) {
|
||||||
|
b.ReportAllocs()
|
||||||
|
|
||||||
|
var rttStats utils.RTTStats
|
||||||
|
sph := newSentPacketHandler(
|
||||||
|
0,
|
||||||
|
1200,
|
||||||
|
&rttStats,
|
||||||
|
&utils.ConnectionStats{},
|
||||||
|
true,
|
||||||
|
false,
|
||||||
|
protocol.PerspectiveClient,
|
||||||
|
nil,
|
||||||
|
utils.DefaultLogger,
|
||||||
|
)
|
||||||
|
now := time.Now()
|
||||||
|
sph.DropPackets(protocol.EncryptionInitial, now)
|
||||||
|
sph.DropPackets(protocol.EncryptionHandshake, now)
|
||||||
|
|
||||||
|
streamFrames := []StreamFrame{{Frame: &wire.StreamFrame{}}}
|
||||||
|
|
||||||
|
pns := make([]protocol.PacketNumber, 0, ackEvery+inFlight)
|
||||||
|
|
||||||
|
var counter int
|
||||||
|
ranges := make([]wire.AckRange, 0, ackEvery)
|
||||||
|
for b.Loop() {
|
||||||
|
counter++
|
||||||
|
pn := sph.PopPacketNumber(protocol.Encryption1RTT)
|
||||||
|
sph.SentPacket(
|
||||||
|
now,
|
||||||
|
pn,
|
||||||
|
protocol.InvalidPacketNumber,
|
||||||
|
streamFrames,
|
||||||
|
nil,
|
||||||
|
protocol.Encryption1RTT,
|
||||||
|
protocol.ECNNon,
|
||||||
|
1200,
|
||||||
|
false, false,
|
||||||
|
)
|
||||||
|
now = now.Add(time.Millisecond)
|
||||||
|
pns = append(pns, pn)
|
||||||
|
|
||||||
|
if counter > inFlight && counter%ackEvery == 0 {
|
||||||
|
sph.ReceivedAck(
|
||||||
|
&wire.AckFrame{AckRanges: appendAckRanges(ranges, pns[:ackEvery]...)},
|
||||||
|
protocol.Encryption1RTT,
|
||||||
|
now,
|
||||||
|
)
|
||||||
|
pns = append(pns[:0], pns[ackEvery:]...)
|
||||||
|
ranges = ranges[:0]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user