Skip to content

Commit 148ee16

Browse files
committed
opt: get as much data read from socket per loop as possible
1 parent 747896a commit 148ee16

File tree

5 files changed

+43
-32
lines changed

5 files changed

+43
-32
lines changed

connection_unix.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,7 @@ func (c *conn) ReadN(n int) (int, []byte) {
176176
return inBufferLen, buf
177177
}
178178
buf, _ := c.inboundBuffer.Peek(n)
179-
return n, buf
179+
return len(buf), buf
180180
}
181181

182182
func (c *conn) ShiftN(n int) int {

gnet.go

+6-3
Original file line numberDiff line numberDiff line change
@@ -283,10 +283,13 @@ func Serve(eventHandler EventHandler, protoAddr string, opts ...Option) (err err
283283
"while you are trying to set up %d\n", options.NumEventLoop)
284284
return errors.ErrTooManyEventLoopThreads
285285
}
286-
287-
if rbc := options.ReadBufferCap; rbc <= 0 {
286+
rbc := options.ReadBufferCap
287+
switch {
288+
case rbc <= 0:
288289
options.ReadBufferCap = ringbuffer.TCPReadBufferSize
289-
} else {
290+
case rbc <= ringbuffer.DefaultBufferSize:
291+
options.ReadBufferCap = ringbuffer.DefaultBufferSize
292+
default:
290293
options.ReadBufferCap = toolkit.CeilToPowerOfTwo(rbc)
291294
ringbuffer.TCPReadBufferSize = options.ReadBufferCap
292295
}

pkg/ringbuffer/ring_buffer.go

+4-3
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,8 @@ import (
2727
)
2828

2929
const (
30-
defaultBufferSize = 1024 // 1KB for the first-time allocation on ring-buffer.
30+
// DefaultBufferSize is the first-time allocation on a ring-buffer.
31+
DefaultBufferSize = 1024 // 1KB
3132
bufferGrowThreshold = 4 * 1024 // 4KB
3233
)
3334

@@ -380,8 +381,8 @@ func (rb *RingBuffer) Reset() {
380381

381382
func (rb *RingBuffer) grow(newCap int) {
382383
if n := rb.size; n == 0 {
383-
if newCap <= defaultBufferSize {
384-
newCap = defaultBufferSize
384+
if newCap <= DefaultBufferSize {
385+
newCap = DefaultBufferSize
385386
} else {
386387
newCap = toolkit.CeilToPowerOfTwo(newCap)
387388
}

pkg/ringbuffer/ring_buffer_test.go

+13-13
Original file line numberDiff line numberDiff line change
@@ -127,9 +127,9 @@ func TestZeroRingBuffer(t *testing.T) {
127127
assert.EqualValues(t, 0, rb.Free(), "expect free is 0")
128128
buf := []byte(strings.Repeat("1234", 12))
129129
_, _ = rb.Write(buf)
130-
assert.EqualValuesf(t, defaultBufferSize, rb.Len(), "expect rb.Len()=%d, but got rb.Len()=%d", defaultBufferSize, rb.Len())
131-
assert.EqualValuesf(t, defaultBufferSize, rb.Cap(), "expect rb.Cap()=%d, but got rb.Cap()=%d", defaultBufferSize, rb.Cap())
132-
assert.Truef(t, rb.r == 0 && rb.w == 48 && rb.size == defaultBufferSize, "expect rb.r=0, rb.w=48, rb.size=64, rb.mask=63, but got rb.r=%d, rb.w=%d, rb.size=%d", rb.r, rb.w, rb.size)
130+
assert.EqualValuesf(t, DefaultBufferSize, rb.Len(), "expect rb.Len()=%d, but got rb.Len()=%d", DefaultBufferSize, rb.Len())
131+
assert.EqualValuesf(t, DefaultBufferSize, rb.Cap(), "expect rb.Cap()=%d, but got rb.Cap()=%d", DefaultBufferSize, rb.Cap())
132+
assert.Truef(t, rb.r == 0 && rb.w == 48 && rb.size == DefaultBufferSize, "expect rb.r=0, rb.w=48, rb.size=64, rb.mask=63, but got rb.r=%d, rb.w=%d, rb.size=%d", rb.r, rb.w, rb.size)
133133
assert.EqualValues(t, buf, rb.ByteBuffer().Bytes(), "expect it is equal")
134134
rb.Discard(48)
135135
assert.Truef(t, rb.IsEmpty() && rb.r == 0 && rb.w == 0, "expect rb is empty and rb.r=rb.w=0, but got rb.r=%d and rb.w=%d", rb.r, rb.w)
@@ -140,29 +140,29 @@ func TestRingBufferGrow(t *testing.T) {
140140
head, tail := rb.Peek(2)
141141
assert.Empty(t, head, "head should be empty")
142142
assert.Empty(t, tail, "tail should be empty")
143-
data := make([]byte, defaultBufferSize+1)
143+
data := make([]byte, DefaultBufferSize+1)
144144
n, err := rand.Read(data)
145145
assert.NoError(t, err, "failed to generate random data")
146-
assert.EqualValuesf(t, defaultBufferSize+1, n, "expect random data length is %d but got %d", defaultBufferSize+1, n)
146+
assert.EqualValuesf(t, DefaultBufferSize+1, n, "expect random data length is %d but got %d", DefaultBufferSize+1, n)
147147
n, err = rb.Write(data)
148148
assert.NoError(t, err)
149-
assert.EqualValues(t, defaultBufferSize+1, n)
150-
assert.EqualValues(t, 2*defaultBufferSize, rb.Cap())
151-
assert.EqualValues(t, 2*defaultBufferSize, rb.Len())
152-
assert.EqualValues(t, defaultBufferSize+1, rb.Length())
153-
assert.EqualValues(t, defaultBufferSize-1, rb.Free())
149+
assert.EqualValues(t, DefaultBufferSize+1, n)
150+
assert.EqualValues(t, 2*DefaultBufferSize, rb.Cap())
151+
assert.EqualValues(t, 2*DefaultBufferSize, rb.Len())
152+
assert.EqualValues(t, DefaultBufferSize+1, rb.Length())
153+
assert.EqualValues(t, DefaultBufferSize-1, rb.Free())
154154
assert.EqualValues(t, data, rb.ByteBuffer().Bytes())
155155

156-
rb = New(defaultBufferSize)
156+
rb = New(DefaultBufferSize)
157157
newData := make([]byte, 3*512)
158158
n, err = rand.Read(newData)
159159
assert.NoError(t, err, "failed to generate random data")
160160
assert.EqualValuesf(t, 3*512, n, "expect random data length is %d but got %d", 3*512, n)
161161
n, err = rb.Write(newData)
162162
assert.NoError(t, err)
163163
assert.EqualValues(t, 3*512, n)
164-
assert.EqualValues(t, 2*defaultBufferSize, rb.Cap())
165-
assert.EqualValues(t, 2*defaultBufferSize, rb.Len())
164+
assert.EqualValues(t, 2*DefaultBufferSize, rb.Cap())
165+
assert.EqualValues(t, 2*DefaultBufferSize, rb.Len())
166166
assert.EqualValues(t, 3*512, rb.Length())
167167
assert.EqualValues(t, 512, rb.Free())
168168
assert.EqualValues(t, newData, rb.ByteBuffer().Bytes())

pkg/ringbuffer/ring_buffer_unix.go

+19-12
Original file line numberDiff line numberDiff line change
@@ -35,20 +35,27 @@ func (rb *RingBuffer) CopyFromSocket(fd int) (n int, err error) {
3535
}
3636

3737
// Rewind moves the data from its tail to head and rewind its pointers of read and write.
38-
func (rb *RingBuffer) Rewind() int {
38+
func (rb *RingBuffer) Rewind() (n int) {
3939
if rb.IsEmpty() {
4040
rb.Reset()
41-
return 0
41+
return
4242
}
43-
if rb.w != 0 {
44-
return 0
45-
}
46-
if rb.r < rb.size-rb.r {
47-
rb.grow(rb.size + rb.size/2)
48-
return rb.size - rb.r
43+
if rb.w == 0 {
44+
if rb.r < rb.size-rb.r {
45+
rb.grow(rb.size + rb.size - rb.r)
46+
return rb.size - rb.r
47+
}
48+
n = copy(rb.buf, rb.buf[rb.r:])
49+
rb.r = 0
50+
rb.w = n
51+
} else if rb.size-rb.w < DefaultBufferSize {
52+
if rb.r < rb.w-rb.r {
53+
rb.grow(rb.size + rb.w - rb.r)
54+
return rb.w - rb.r
55+
}
56+
n = copy(rb.buf, rb.buf[rb.r:rb.w])
57+
rb.r = 0
58+
rb.w = n
4959
}
50-
n := copy(rb.buf, rb.buf[rb.r:])
51-
rb.r = 0
52-
rb.w = n
53-
return n
60+
return
5461
}

0 commit comments

Comments
 (0)