From 7e712dfeb68c142b4f4cb1c6e864afa757342780 Mon Sep 17 00:00:00 2001 From: Aliaksandr Valialkin Date: Thu, 23 Jun 2016 15:09:07 +0300 Subject: [PATCH] Drop buffers with under-used capacity in order to reduce memory waste --- pool.go | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/pool.go b/pool.go index 6163417..9f3f5df 100644 --- a/pool.go +++ b/pool.go @@ -35,15 +35,22 @@ func (p *byteBufferPool) Acquire() *ByteBuffer { func (p *byteBufferPool) Release(b *ByteBuffer) { n := cap(b.B) if n > maxSize { - // Just drop oversized buffers. + // Oversized buffer. + // Drop it. return } + if (n >> 2) > len(b.B) { + // Under-used buffer capacity. + // Drop it. + return + } + b.B = b.B[:0] - idx := bitsize(n-1) >> minBitSize + idx := bitSize(n-1) >> minBitSize p.pools[idx].Put(b) } -func bitsize(n int) int { +func bitSize(n int) int { s := 0 for n > 0 { n >>= 1