Skip to content

Commit 15f820e

Browse files
committed
rpc_util: use array for the simple shared buffer pool
1 parent 5155566 commit 15f820e

File tree

1 file changed

+31
-33
lines changed

1 file changed

+31
-33
lines changed

shared_buffer_pool.go

Lines changed: 31 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -46,56 +46,44 @@ type SharedBufferPool interface {
4646
// later release.
4747
func NewSimpleSharedBufferPool() SharedBufferPool {
4848
return &simpleSharedBufferPool{
49-
pool0: makeBytesPool(level0PoolMaxSize),
50-
pool1: makeBytesPool(level1PoolMaxSize),
51-
pool2: makeBytesPool(level2PoolMaxSize),
52-
pool3: makeBytesPool(level3PoolMaxSize),
53-
pool4: makeBytesPool(level4PoolMaxSize),
54-
poolMax: makeFallbackBytesPool(),
49+
pools: [poolArraySize]bufferPool{
50+
makeBytesPool(level0PoolMaxSize),
51+
makeBytesPool(level1PoolMaxSize),
52+
makeBytesPool(level2PoolMaxSize),
53+
makeBytesPool(level3PoolMaxSize),
54+
makeBytesPool(level4PoolMaxSize),
55+
makeFallbackBytesPool(),
56+
},
5557
}
5658
}
5759

5860
// simpleSharedBufferPool is a simple implementation of SharedBufferPool.
5961
type simpleSharedBufferPool struct {
60-
pool0 bufferPool
61-
pool1 bufferPool
62-
pool2 bufferPool
63-
pool3 bufferPool
64-
pool4 bufferPool
65-
poolMax bufferPool
62+
pools [poolArraySize]bufferPool
6663
}
6764

6865
func (p *simpleSharedBufferPool) Get(size int) []byte {
69-
switch {
70-
case size <= level0PoolMaxSize:
71-
return p.pool0.Get(size)
72-
case size <= level1PoolMaxSize:
73-
return p.pool1.Get(size)
74-
case size <= level2PoolMaxSize:
75-
return p.pool2.Get(size)
76-
case size <= level3PoolMaxSize:
77-
return p.pool3.Get(size)
78-
case size <= level4PoolMaxSize:
79-
return p.pool4.Get(size)
80-
default:
81-
return p.poolMax.Get(size)
82-
}
66+
return p.pools[p.poolIdx(size)].Get(size)
8367
}
8468

8569
func (p *simpleSharedBufferPool) Put(bs *[]byte) {
86-
switch size := cap(*bs); {
70+
p.pools[p.poolIdx(cap(*bs))].Put(bs)
71+
}
72+
73+
func (p *simpleSharedBufferPool) poolIdx(size int) int {
74+
switch {
8775
case size <= level0PoolMaxSize:
88-
p.pool0.Put(bs)
76+
return level0PoolIdx
8977
case size <= level1PoolMaxSize:
90-
p.pool1.Put(bs)
78+
return level1PoolIdx
9179
case size <= level2PoolMaxSize:
92-
p.pool2.Put(bs)
80+
return level2PoolIdx
9381
case size <= level3PoolMaxSize:
94-
p.pool3.Put(bs)
82+
return level3PoolIdx
9583
case size <= level4PoolMaxSize:
96-
p.pool4.Put(bs)
84+
return level4PoolIdx
9785
default:
98-
p.poolMax.Put(bs)
86+
return levelMaxPoolIdx
9987
}
10088
}
10189

@@ -107,6 +95,16 @@ const (
10795
level4PoolMaxSize = level3PoolMaxSize * 16 // 1 MB
10896
)
10997

98+
const (
99+
level0PoolIdx = iota
100+
level1PoolIdx
101+
level2PoolIdx
102+
level3PoolIdx
103+
level4PoolIdx
104+
levelMaxPoolIdx
105+
poolArraySize
106+
)
107+
110108
type bufferPool struct {
111109
sync.Pool
112110
}

0 commit comments

Comments
 (0)