2 回答
TA贡献1807条经验 获得超9个赞
您可以从bufs.Cache.Get获取非零字节缓冲区(或查看并发安全版本)。从文档:CCache
注意:Get 返回的缓冲区不保证为零。例如,将缓冲区传递给 io.Reader 是可以的。如果您需要清零缓冲区,请使用 Cget。
TA贡献1853条经验 获得超18个赞
从技术上讲,您可以通过在 go 运行时之外分配内存并使用unsafe.Pointer,但这绝对是错误的做法。
更好的解决方案是减少分配次数。将缓冲区移到循环外,或者,如果您需要每个 goroutine 缓冲区,请在池中分配几个缓冲区,并仅在需要时分配更多缓冲区。
type BufferPool struct {
Capacity int
buffersize int
buffers []byte
lock sync.Mutex
}
func NewBufferPool(buffersize int, cap int) {
ret := new(BufferPool)
ret.Capacity = cap
ret.buffersize = buffersize
return ret
}
func (b *BufferPool) Alloc() []byte {
b.lock.Lock()
defer b.lock.Unlock()
if len(b.buffers) == 0 {
return make([]byte, b.buffersize)
} else {
ret := b.buffers[len(b.buffers) - 1]
b.buffers = b.buffers[0:len(b.buffers) - 1]
return ret
}
}
func (b *BufferPool) Free(buf []byte) {
if len(buf) != b.buffersize {
panic("illegal free")
}
b.lock.Lock()
defer b.lock.Unlock()
if len(b.buffers) < b.Capacity {
b.buffers = append(b.buffers, buf)
}
}
- 2 回答
- 0 关注
- 187 浏览
添加回答
举报