@@ -46,56 +46,44 @@ type SharedBufferPool interface {
46
46
// later release.
47
47
func NewSimpleSharedBufferPool () SharedBufferPool {
48
48
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
+ },
55
57
}
56
58
}
57
59
58
60
// simpleSharedBufferPool is a simple implementation of SharedBufferPool.
59
61
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
66
63
}
67
64
68
65
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 )
83
67
}
84
68
85
69
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 {
87
75
case size <= level0PoolMaxSize :
88
- p . pool0 . Put ( bs )
76
+ return level0PoolIdx
89
77
case size <= level1PoolMaxSize :
90
- p . pool1 . Put ( bs )
78
+ return level1PoolIdx
91
79
case size <= level2PoolMaxSize :
92
- p . pool2 . Put ( bs )
80
+ return level2PoolIdx
93
81
case size <= level3PoolMaxSize :
94
- p . pool3 . Put ( bs )
82
+ return level3PoolIdx
95
83
case size <= level4PoolMaxSize :
96
- p . pool4 . Put ( bs )
84
+ return level4PoolIdx
97
85
default :
98
- p . poolMax . Put ( bs )
86
+ return levelMaxPoolIdx
99
87
}
100
88
}
101
89
@@ -107,6 +95,16 @@ const (
107
95
level4PoolMaxSize = level3PoolMaxSize * 16 // 1 MB
108
96
)
109
97
98
+ const (
99
+ level0PoolIdx = iota
100
+ level1PoolIdx
101
+ level2PoolIdx
102
+ level3PoolIdx
103
+ level4PoolIdx
104
+ levelMaxPoolIdx
105
+ poolArraySize
106
+ )
107
+
110
108
type bufferPool struct {
111
109
sync.Pool
112
110
}
0 commit comments