From 25bd34f875a3b0d46d96f552332180b821cd4e02 Mon Sep 17 00:00:00 2001 From: Abolfazl Date: Sun, 22 Mar 2026 16:55:27 +0330 Subject: [PATCH] Implement address caching in asyncWriterWorker Optimize address resolution by caching UDP addresses. --- internal/client/async_runtime.go | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/internal/client/async_runtime.go b/internal/client/async_runtime.go index 16d3199..3c30a68 100644 --- a/internal/client/async_runtime.go +++ b/internal/client/async_runtime.go @@ -163,17 +163,27 @@ drainRX: } // asyncWriterWorker fires packets from txChannel at the destination. +// Uses a per-worker address cache to avoid repeated net.ResolveUDPAddr calls. func (c *Client) asyncWriterWorker(ctx context.Context, id int, conn *net.UDPConn) { defer c.asyncWG.Done() c.log.Debugf("\U0001F680 Writer Worker #%d started", id) + + addrCache := make(map[string]*net.UDPAddr, 16) + for { select { case <-ctx.Done(): return case pkt := <-c.txChannel: - addr, err := net.ResolveUDPAddr("udp", fmt.Sprintf("%s:%d", pkt.conn.Resolver, pkt.conn.ResolverPort)) - if err != nil { - continue + resolverKey := fmt.Sprintf("%s:%d", pkt.conn.Resolver, pkt.conn.ResolverPort) + addr, ok := addrCache[resolverKey] + if !ok { + var err error + addr, err = net.ResolveUDPAddr("udp", resolverKey) + if err != nil { + continue + } + addrCache[resolverKey] = addr } if c.tunnelPacketTimeout > 0 {