From 8b28dbcd3c492b30f6c579d6b655eb79e107077b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BA=90=E6=96=87=E9=9B=A8?= <41315874+fumiama@users.noreply.github.com> Date: Fri, 4 Apr 2025 01:52:15 +0900 Subject: [PATCH] optimize: re-impl. bufrings --- gold/link/listen.go | 38 +++++++++++++++++++++++++++++++++----- 1 file changed, 33 insertions(+), 5 deletions(-) diff --git a/gold/link/listen.go b/gold/link/listen.go index f22aaef..fe57b4c 100644 --- a/gold/link/listen.go +++ b/gold/link/listen.go @@ -3,6 +3,7 @@ package link import ( "errors" "net" + "runtime" "strconv" "sync/atomic" "time" @@ -27,6 +28,9 @@ func (m *Me) listen() (conn p2p.Conn, err error) { } m.ep = conn.LocalAddr() logrus.Infoln("[listen] at", m.ep) + ncpu := runtime.NumCPU() + bufs := make([]byte, lstnbufgragsz*ncpu) + fils := make([]uintptr, ncpu) go func() { var ( n int @@ -34,7 +38,26 @@ func (m *Me) listen() (conn p2p.Conn, err error) { err error ) for { - lbf := pbuf.NewBytes(lstnbufgragsz) + idx := -1 + for i := 0; i < ncpu; i++ { + if !atomic.CompareAndSwapUintptr(&fils[i], 0, 1) { + continue + } + idx = i + break + } + + var ( + lbf pbuf.Bytes + fil *uintptr + ) + if idx < 0 { + lbf = pbuf.NewBytes(lstnbufgragsz) + } else { + lbf = pbuf.ParseBytes(bufs[idx*lstnbufgragsz : (idx+1)*lstnbufgragsz]...) + fil = &fils[idx] + } + lbf.V(func(b []byte) { n, addr, err = conn.ReadFromPeer(b) }) @@ -57,16 +80,21 @@ func (m *Me) listen() (conn p2p.Conn, err error) { } continue } - go m.waitordispatch(addr, lbf, n) + go m.waitordispatch(addr, lbf, n, fil) } }() return } -func (m *Me) waitordispatch(addr p2p.EndPoint, buf pbuf.Bytes, n int) { - defer buf.ManualDestroy() +func (m *Me) waitordispatch(addr p2p.EndPoint, buf pbuf.Bytes, n int, fil *uintptr) { + defer func() { + buf.ManualDestroy() + if fil != nil { + atomic.StoreUintptr(fil, 0) + } + }() - recvtotlcnt := atomic.AddUint64(&m.recvtotlcnt, uint64(buf.Len())) + recvtotlcnt := atomic.AddUint64(&m.recvtotlcnt, uint64(n)) recvloopcnt := atomic.AddUintptr(&m.recvloopcnt, 1) recvlooptime := atomic.LoadInt64(&m.recvlooptime) if recvloopcnt%uintptr(m.speedloop) == 0 {