Files
quic-go/qlog/benchmark_test.go
2025-11-14 04:04:40 +03:00

87 lines
2.5 KiB
Go

package qlog
import (
"io"
"testing"
"time"
"git.geeks-team.ru/gr1ffon/quic-go/internal/protocol"
"git.geeks-team.ru/gr1ffon/quic-go/internal/utils"
"git.geeks-team.ru/gr1ffon/quic-go/internal/wire"
"git.geeks-team.ru/gr1ffon/quic-go/qlogwriter"
)
type nopWriteCloserImpl struct{ io.Writer }
func (nopWriteCloserImpl) Close() error { return nil }
func nopWriteCloser(w io.Writer) io.WriteCloser {
return &nopWriteCloserImpl{Writer: w}
}
// BenchmarkConnectionTracing aims to benchmark a somewhat realistic connection that sends and receives packets.
func BenchmarkConnectionTracing(b *testing.B) {
b.ReportAllocs()
srcConnID := protocol.ParseConnectionID([]byte{0xde, 0xca, 0xfb, 0xad})
trace := qlogwriter.NewConnectionFileSeq(
nopWriteCloser(io.Discard),
false,
protocol.ParseConnectionID([]byte{0xde, 0xad, 0xbe, 0xef}),
[]string{EventSchema},
)
go trace.Run()
tracer := trace.AddProducer()
b.Cleanup(func() { tracer.Close() })
rttStats := utils.NewRTTStats()
rttStats.UpdateRTT(1337*time.Millisecond, 0)
rttStats.UpdateRTT(1000*time.Millisecond, 10*time.Millisecond)
rttStats.UpdateRTT(800*time.Millisecond, 100*time.Millisecond)
var i int
for b.Loop() {
i++
tracer.RecordEvent(&PacketSent{
Header: PacketHeader{
PacketType: PacketType1RTT,
PacketNumber: 1234 + protocol.PacketNumber(i),
KeyPhaseBit: KeyPhaseZero,
DestConnectionID: srcConnID,
},
Raw: RawInfo{Length: 1337},
ECN: ECT0,
Frames: []Frame{
{Frame: &AckFrame{AckRanges: []wire.AckRange{{Largest: 12345 + protocol.PacketNumber(2*i), Smallest: 1234 + protocol.PacketNumber(i)}}}},
{Frame: &MaxStreamDataFrame{StreamID: 42, MaximumStreamData: 987 + protocol.ByteCount(i)}},
},
})
tracer.RecordEvent(&MetricsUpdated{
MinRTT: rttStats.MinRTT(),
SmoothedRTT: rttStats.SmoothedRTT(),
LatestRTT: rttStats.LatestRTT(),
RTTVariance: rttStats.MeanDeviation(),
CongestionWindow: int(12345 + protocol.ByteCount(2*i)),
BytesInFlight: int(12345 + protocol.ByteCount(i)),
PacketsInFlight: i,
})
if i%2 == 0 {
tracer.RecordEvent(&PacketReceived{
Header: PacketHeader{
PacketType: PacketType1RTT,
PacketNumber: 1337 + protocol.PacketNumber(i),
KeyPhaseBit: KeyPhaseOne,
DestConnectionID: srcConnID,
},
Raw: RawInfo{Length: 1337},
ECN: ECT0,
Frames: []Frame{
{Frame: &StreamFrame{StreamID: 123, Offset: int64(1234 + protocol.ByteCount(100*i)), Length: 100, Fin: true}},
},
})
}
}
}