buffer_pool.go 830 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. package buf
  2. import (
  3. "sync"
  4. )
  5. const (
  6. // Size of a regular buffer.
  7. Size = 2 * 1024
  8. )
  9. func createAllocFunc(size uint32) func() interface{} {
  10. return func() interface{} {
  11. return make([]byte, size)
  12. }
  13. }
  14. const (
  15. numPools = 5
  16. sizeMulti = 4
  17. )
  18. var (
  19. pool [numPools]sync.Pool
  20. poolSize [numPools]uint32
  21. )
  22. func init() {
  23. size := uint32(Size)
  24. for i := 0; i < numPools; i++ {
  25. pool[i] = sync.Pool{
  26. New: createAllocFunc(size),
  27. }
  28. poolSize[i] = size
  29. size *= sizeMulti
  30. }
  31. }
  32. func newBytes(size uint32) []byte {
  33. for idx, ps := range poolSize {
  34. if size <= ps {
  35. return pool[idx].Get().([]byte)
  36. }
  37. }
  38. return make([]byte, size)
  39. }
  40. func freeBytes(b []byte) {
  41. size := uint32(cap(b))
  42. b = b[0:cap(b)]
  43. for i := numPools - 1; i >= 0; i-- {
  44. ps := poolSize[i]
  45. if size >= ps {
  46. pool[i].Put(b)
  47. return
  48. }
  49. }
  50. }