diff options
| author | Mike O'Driscoll <mikeo@tailscale.com> | 2026-03-24 10:52:20 -0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2026-03-24 10:52:20 -0400 |
| commit | 1403920367135fc2559ee97123a64bae2405365d (patch) | |
| tree | 0102cc83810f9f0afdc9f5025a41c6d32175fb8c /control/controlhttp/controlhttpserver | |
| parent | 1d0fde6fc245d5e24ac52e07720d622ca32be7e7 (diff) | |
| download | tailscale-1403920367135fc2559ee97123a64bae2405365d.tar.xz tailscale-1403920367135fc2559ee97123a64bae2405365d.zip | |
derp,types,util: use bufio Peek+Discard for allocation-free fast reads (#19067)
Replace byte-at-a-time ReadByte loops with Peek+Discard in the DERP
read path. Peek returns a slice into bufio's internal buffer without
allocating, and Discard advances the read pointer without copying.
Introduce util/bufiox with a BufferedReader interface and ReadFull
helper that uses Peek+copy+Discard as an allocation-free alternative
to io.ReadFull.
- derp.ReadFrameHeader: replace 5× ReadByte with Peek(5)+Discard(5),
reading the frame type and length directly from the peeked slice.
Remove now-unused readUint32 helper.
name old ns/op new ns/op speedup
ReadFrameHeader-8 24.2 12.4 ~2x
(0 allocs/op in both)
- key.NodePublic.ReadRawWithoutAllocating: replace 32× ReadByte with
bufiox.ReadFull. Addresses the "Dear future" comment about switching
away from byte-at-a-time reads once a non-escaping alternative exists.
name old ns/op new ns/op speedup
NodeReadRawWithoutAllocating-8 140 43.6 ~3.2x
(0 allocs/op in both)
- derpserver.handleFramePing: replace io.ReadFull with bufiox.ReadFull.
Updates tailscale/corp#38509
Signed-off-by: Mike O'Driscoll <mikeo@tailscale.com>
Diffstat (limited to 'control/controlhttp/controlhttpserver')
0 files changed, 0 insertions, 0 deletions
