| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172 |
- package batch
- import (
- "testing"
- )
- // buildUDPv4BulkFlow returns n equal-size datagrams on one flow — the
- // steady state for single-flow QUIC bulk, the workload USO exists for.
- func buildUDPv4BulkFlow(n, payloadLen int) [][]byte {
- pay := make([]byte, payloadLen)
- pkts := make([][]byte, n)
- for i := range pkts {
- pkts[i] = buildUDPv4(40000, 443, pay)
- }
- return pkts
- }
- // buildUDPv4RunInterleaved mirrors buildTCPv4RunInterleaved: nFlows*perFlow
- // datagrams arriving in GRO-burst runs of runLen per flow.
- func buildUDPv4RunInterleaved(nFlows, perFlow, runLen, payloadLen int) [][]byte {
- pay := make([]byte, payloadLen)
- pkts := make([][]byte, 0, nFlows*perFlow)
- for done := 0; done < perFlow; done += runLen {
- for f := range nFlows {
- sport := uint16(40000 + f)
- for range runLen {
- pkts = append(pkts, buildUDPv4(sport, 443, pay))
- }
- }
- }
- return pkts
- }
- // runUDPCommitBench drives UDPCoalescer.Commit over pkts batchSize at a
- // time, flushing between batches, and reports per-packet cost.
- func runUDPCommitBench(b *testing.B, pkts [][]byte, batchSize int) {
- b.Helper()
- c := newTestUDPCoalescer(b, nopTunWriter{})
- b.ReportAllocs()
- b.SetBytes(int64(len(pkts[0])))
- b.ResetTimer()
- for i := 0; i < b.N; i++ {
- pkt := pkts[i%len(pkts)]
- if err := c.Commit(pkt); err != nil {
- b.Fatal(err)
- }
- if (i+1)%batchSize == 0 {
- if err := c.Flush(); err != nil {
- b.Fatal(err)
- }
- }
- }
- _ = c.Flush()
- }
- // BenchmarkUDPCommitSingleFlow is the single-flow bulk steady state.
- func BenchmarkUDPCommitSingleFlow(b *testing.B) {
- pkts := buildUDPv4BulkFlow(udpCoalesceMaxSegs, 1200)
- runUDPCommitBench(b, pkts, udpCoalesceMaxSegs)
- }
- // BenchmarkUDPCommitInterleaved4 is the adversarial per-packet round-robin.
- func BenchmarkUDPCommitInterleaved4(b *testing.B) {
- pkts := buildUDPv4RunInterleaved(4, udpCoalesceMaxSegs, 1, 1200)
- runUDPCommitBench(b, pkts, len(pkts))
- }
- // BenchmarkUDPCommitRunInterleaved4 is 4 flows in GRO-burst runs of 16.
- func BenchmarkUDPCommitRunInterleaved4(b *testing.B) {
- pkts := buildUDPv4RunInterleaved(4, udpCoalesceMaxSegs, 16, 1200)
- runUDPCommitBench(b, pkts, len(pkts))
- }
|