mirror of
https://github.com/duanhf2012/origin.git
synced 2026-02-03 22:45:13 +08:00
增大内存池分布
This commit is contained in:
@@ -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)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user