import (
"sync"
+ "time"
)
type Buf[T any] struct {
- maxsize int
- newF func() *T
- inUse func(*T) bool
- reuseF func(*T) *T
- poolF func(*T) *T
- mbuf map[*T]bool
- l sync.RWMutex
+ maxsize int
+ newF func() *T
+ inUse func(*T) bool
+ reuseF func(*T) *T
+ poolF func(*T) *T
+ mbuf map[*T]bool
+ getPerSec float64
+ periodCount float64
+ periodTime time.Time
+ l sync.RWMutex
}
// 创建池
t.poolF = PoolF
t.maxsize = maxsize
t.mbuf = make(map[*T]bool)
+ t.periodTime = time.Now()
return t
}
-// states[] 0:pooled, 1:nopooled, 2:inuse, 3:nouse, 4:sum
+// states[] 0:pooled, 1:nopooled, 2:inuse, 3:nouse, 4:sum, 5:getPerSec
func (t *Buf[T]) PoolState() (states []any) {
t.l.RLock()
defer t.l.RUnlock()
var pooled, nopooled, inuse, nouse, sum int
+ var getPerSec float64
sum = len(t.mbuf)
for k, v := range t.mbuf {
}
}
- return []any{pooled, nopooled, inuse, nouse, sum}
+ getPerSec = t.periodCount / 10
+ if diff := time.Since(t.periodTime).Seconds(); diff > 1 {
+ getPerSec += t.getPerSec / diff
+ }
+
+ return []any{pooled, nopooled, inuse, nouse, sum, getPerSec}
}
func (t *Buf[T]) Get() *T {
t.l.Lock()
defer t.l.Unlock()
+ t.getPerSec += 1
+ if diff := time.Since(t.periodTime).Seconds(); diff > 10 {
+ t.periodCount = t.getPerSec
+ t.getPerSec = 0
+ t.periodTime = time.Now()
+ }
+
for k, v := range t.mbuf {
if v && !t.inUse(k) {
t.mbuf[k] = false
import (
"bytes"
+ "math"
"testing"
+ "time"
"unsafe"
)
v bool
}
+func Test1(t *testing.T) {
+ var newf = func() *a {
+ return &a{v: true}
+ }
+
+ var validf = func(t *a) bool {
+ return t.v
+ }
+
+ var reusef = func(t *a) *a {
+ t.d = t.d[:0]
+ t.v = true
+ return t
+ }
+
+ var poolf = func(t *a) *a {
+ return t
+ }
+
+ var b = New(newf, validf, reusef, poolf, 10)
+
+ for i := 0; i < 10; i++ {
+ b.Get()
+ }
+ time.Sleep(time.Millisecond * 1100)
+ if math.Abs(b.PoolState()[5].(float64)-7.5) > 2.5 {
+ t.Fatal(b.PoolState()[5])
+ }
+}
+
func TestXxx(t *testing.T) {
var newf = func() *a {
return &a{v: true}