| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556 |
- package buf
- import (
- "sync"
- )
- const (
- // Size of a regular buffer.
- Size = 2 * 1024
- )
- func createAllocFunc(size uint32) func() interface{} {
- return func() interface{} {
- return make([]byte, size)
- }
- }
- const (
- numPools = 5
- sizeMulti = 4
- )
- var (
- pool [numPools]*sync.Pool
- poolSize [numPools]uint32
- )
- func init() {
- size := uint32(Size)
- for i := 0; i < numPools; i++ {
- pool[i] = &sync.Pool{
- New: createAllocFunc(size),
- }
- poolSize[i] = size
- size *= sizeMulti
- }
- }
- func newBytes(size uint32) []byte {
- for idx, ps := range poolSize {
- if size <= ps {
- return pool[idx].Get().([]byte)
- }
- }
- return make([]byte, size)
- }
- func freeBytes(b []byte) {
- size := uint32(cap(b))
- for i := numPools - 1; i >= 0; i-- {
- ps := poolSize[i]
- if size >= ps {
- pool[i].Put(b)
- }
- }
- }
|