]> 127.0.0.1 Git - part/.git/commitdiff
1 v0.28.0+2023112502e7bcd
authorqydysky <qydysky@foxmail.com>
Sat, 25 Nov 2023 09:16:50 +0000 (17:16 +0800)
committerqydysky <qydysky@foxmail.com>
Sat, 25 Nov 2023 09:16:50 +0000 (17:16 +0800)
pool/Pool.go
pool/Pool_test.go

index 54e3d9997fe9f2d4b16bc5361b5176fada2b892f..78d33c4f46f43aab3d7ddf832bbdc29215389106 100644 (file)
@@ -2,16 +2,20 @@ package part
 
 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
 }
 
 // 创建池
@@ -33,15 +37,17 @@ func New[T any](NewF func() *T, InUse func(*T) bool, ReuseF func(*T) *T, PoolF f
        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 {
@@ -57,13 +63,25 @@ func (t *Buf[T]) PoolState() (states []any) {
                }
        }
 
-       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
index 30f171645a8d1727c26cf25b71e0084877eb3642..b9b718a7926d80f134c2329b57246615b31041d4 100644 (file)
@@ -2,7 +2,9 @@ package part
 
 import (
        "bytes"
+       "math"
        "testing"
+       "time"
        "unsafe"
 )
 
@@ -11,6 +13,36 @@ type a struct {
        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}