增大内存池分布

This commit is contained in:
orgin
2022-03-04 10:56:59 +08:00
parent 83b90f285b
commit 93be70877b

View File

@@ -10,38 +10,37 @@ type INetMempool interface {
} }
type memAreaPool struct { type memAreaPool struct {
minAreaValue int //最小范围值 minAreaValue int //最小范围值
maxAreaValue int //最大范围值 maxAreaValue int //最大范围值
growthValue int //内存增长值 growthValue int //内存增长值
pool []sync.Pool pool []sync.Pool
} }
//小于2048时按64步长增长.>2048时则按2048长度增长 var memAreaPoolList = [3]*memAreaPool{&memAreaPool{minAreaValue: 1, maxAreaValue: 4096, growthValue: 512}, &memAreaPool{minAreaValue: 4097, maxAreaValue: 40960, growthValue: 4096}, &memAreaPool{minAreaValue: 40961, maxAreaValue: 417792, growthValue: 16384}}
var memAreaPoolList = [2]*memAreaPool{&memAreaPool{minAreaValue:1,maxAreaValue: 2048,growthValue:64}, &memAreaPool{minAreaValue: 2049,maxAreaValue:65536,growthValue:2048}}
func init(){ func init() {
for i:=0;i<len(memAreaPoolList);i++{ for i := 0; i < len(memAreaPoolList); i++ {
memAreaPoolList[i].makePool() memAreaPoolList[i].makePool()
} }
} }
func NewMemAreaPool() *memAreaPool{ func NewMemAreaPool() *memAreaPool {
return &memAreaPool{} return &memAreaPool{}
} }
func (areaPool *memAreaPool) makePool(){ func (areaPool *memAreaPool) makePool() {
poolLen := (areaPool.maxAreaValue - areaPool.minAreaValue+1)/areaPool.growthValue poolLen := (areaPool.maxAreaValue - areaPool.minAreaValue + 1) / areaPool.growthValue
areaPool.pool = make([]sync.Pool,poolLen) areaPool.pool = make([]sync.Pool, poolLen)
for i:=0;i<poolLen;i++{ for i := 0; i < poolLen; i++ {
memSize := (areaPool.minAreaValue-1)+(i+1)*areaPool.growthValue memSize := (areaPool.minAreaValue - 1) + (i+1)*areaPool.growthValue
areaPool.pool[i] = sync.Pool{New: func() interface{}{ areaPool.pool[i] = sync.Pool{New: func() interface{} {
//fmt.Println("make memsize:",memSize) //fmt.Println("make memsize:",memSize)
return make([]byte,memSize) return make([]byte, memSize)
}} }}
} }
} }
func (areaPool *memAreaPool) makeByteSlice(size int) []byte{ func (areaPool *memAreaPool) makeByteSlice(size int) []byte {
pos := areaPool.getPosByteSize(size) pos := areaPool.getPosByteSize(size)
if pos > len(areaPool.pool) || pos == -1 { if pos > len(areaPool.pool) || pos == -1 {
return nil return nil
@@ -50,8 +49,8 @@ func (areaPool *memAreaPool) makeByteSlice(size int) []byte{
return areaPool.pool[pos].Get().([]byte)[:size] return areaPool.pool[pos].Get().([]byte)[:size]
} }
func (areaPool *memAreaPool) getPosByteSize(size int) int{ func (areaPool *memAreaPool) getPosByteSize(size int) int {
pos := (size - areaPool.minAreaValue)/areaPool.growthValue pos := (size - areaPool.minAreaValue) / areaPool.growthValue
if pos >= len(areaPool.pool) { if pos >= len(areaPool.pool) {
return -1 return -1
} }
@@ -59,29 +58,29 @@ func (areaPool *memAreaPool) getPosByteSize(size int) int{
return pos return pos
} }
func (areaPool *memAreaPool) releaseByteSlice(byteBuff []byte) bool{ func (areaPool *memAreaPool) releaseByteSlice(byteBuff []byte) bool {
pos := areaPool.getPosByteSize(cap(byteBuff)) pos := areaPool.getPosByteSize(cap(byteBuff))
if pos > len(areaPool.pool) || pos == -1{ if pos > len(areaPool.pool) || pos == -1 {
panic("assert!") panic("assert!")
return false return false
} }
areaPool.pool[pos].Put(byteBuff) areaPool.pool[pos].Put(byteBuff)
return true return true
} }
func (areaPool *memAreaPool) MakeByteSlice(size int) []byte{ func (areaPool *memAreaPool) MakeByteSlice(size int) []byte {
for i:=0;i<len(memAreaPoolList);i++{ for i := 0; i < len(memAreaPoolList); i++ {
if size <= memAreaPoolList[i].maxAreaValue { if size <= memAreaPoolList[i].maxAreaValue {
return memAreaPoolList[i].makeByteSlice(size) return memAreaPoolList[i].makeByteSlice(size)
} }
} }
return nil return make([]byte, size)
} }
func (areaPool *memAreaPool) ReleaseByteSlice(byteBuff []byte) bool { func (areaPool *memAreaPool) ReleaseByteSlice(byteBuff []byte) bool {
for i:=0;i<len(memAreaPoolList);i++{ for i := 0; i < len(memAreaPoolList); i++ {
if cap(byteBuff) <= memAreaPoolList[i].maxAreaValue { if cap(byteBuff) <= memAreaPoolList[i].maxAreaValue {
return memAreaPoolList[i].releaseByteSlice(byteBuff) return memAreaPoolList[i].releaseByteSlice(byteBuff)
} }