From 451138cd0aeeb8c89af6e6e657db5b4a7f40756a Mon Sep 17 00:00:00 2001 From: GoEdgeLab Date: Thu, 5 Oct 2023 16:29:02 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E8=AE=A1=E6=95=B0=E5=99=A8?= =?UTF-8?q?=E7=9B=B8=E5=85=B3=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/utils/counters/item.go | 39 +++++++++++++++++----------- internal/utils/counters/item_test.go | 19 +++++++------- 2 files changed, 34 insertions(+), 24 deletions(-) diff --git a/internal/utils/counters/item.go b/internal/utils/counters/item.go index ba7a15a..c19578b 100644 --- a/internal/utils/counters/item.go +++ b/internal/utils/counters/item.go @@ -33,14 +33,17 @@ func NewItem(lifeSeconds int) *Item { } } -func (this *Item) Increase() uint64 { +func (this *Item) Increase() (result uint64) { var currentTime = fasttime.Now().Unix() var currentSpanIndex = this.calculateSpanIndex(currentTime) // return quickly if this.lastUpdateTime == currentTime { this.spans[currentSpanIndex]++ - return this.Sum() + for _, count := range this.spans { + result += count + } + return } if this.lastUpdateTime > 0 { @@ -50,16 +53,17 @@ func (this *Item) Increase() uint64 { } } else { var lastSpanIndex = this.calculateSpanIndex(this.lastUpdateTime) - var countSpans = len(this.spans) - // reset values between LAST and CURRENT - for index := lastSpanIndex + 1; ; index++ { - var realIndex = index % countSpans - if realIndex <= currentSpanIndex { + if lastSpanIndex != currentSpanIndex { + var countSpans = len(this.spans) + + // reset values between LAST and CURRENT + for index := lastSpanIndex + 1; ; index++ { + var realIndex = index % countSpans this.spans[realIndex] = 0 - } - if realIndex == currentSpanIndex { - break + if realIndex == currentSpanIndex { + break + } } } } @@ -68,7 +72,11 @@ func (this *Item) Increase() uint64 { this.spans[currentSpanIndex]++ this.lastUpdateTime = currentTime - return this.Sum() + for _, count := range this.spans { + result += count + } + + return } func (this *Item) Sum() (result uint64) { @@ -84,10 +92,11 @@ func (this *Item) Sum() (result uint64) { } else { var lastSpanIndex = this.calculateSpanIndex(this.lastUpdateTime) var countSpans = len(this.spans) - for index := 0; index < countSpans; index++ { - if (currentSpanIndex >= lastSpanIndex && (index <= lastSpanIndex || index >= currentSpanIndex /** a >=b **/)) || - (currentSpanIndex < lastSpanIndex && index >= currentSpanIndex && index <= lastSpanIndex /** a < b **/) { - result += this.spans[index] + for index := currentSpanIndex + 1; ; index++ { + var realIndex = index % countSpans + result += this.spans[realIndex] + if realIndex == lastSpanIndex { + break } } } diff --git a/internal/utils/counters/item_test.go b/internal/utils/counters/item_test.go index 7de4759..2a0c1c9 100644 --- a/internal/utils/counters/item_test.go +++ b/internal/utils/counters/item_test.go @@ -18,19 +18,19 @@ func TestItem_Increase(t *testing.T) { } var item = counters.NewItem(10) - t.Log(item.Increase()) + t.Log(item.Increase(), item.Sum()) time.Sleep(1 * time.Second) - t.Log(item.Increase()) + t.Log(item.Increase(), item.Sum()) time.Sleep(2 * time.Second) - t.Log(item.Increase()) + t.Log(item.Increase(), item.Sum()) time.Sleep(5 * time.Second) - t.Log(item.Increase()) + t.Log(item.Increase(), item.Sum()) time.Sleep(6 * time.Second) - t.Log(item.Increase()) + t.Log(item.Increase(), item.Sum()) time.Sleep(5 * time.Second) - t.Log(item.Increase()) + t.Log(item.Increase(), item.Sum()) time.Sleep(11 * time.Second) - t.Log(item.Increase()) + t.Log(item.Increase(), item.Sum()) } func TestItem_Increase2(t *testing.T) { @@ -43,7 +43,7 @@ func TestItem_Increase2(t *testing.T) { var item = counters.NewItem(20) for i := 0; i < 100; i++ { - t.Log(item.Increase(), timeutil.Format("H:i:s")) + t.Log(item.Increase(), item.Sum(), timeutil.Format("H:i:s")) time.Sleep(2 * time.Second) } @@ -69,10 +69,11 @@ func TestItem_IsExpired(t *testing.T) { func BenchmarkItem_Increase(b *testing.B) { runtime.GOMAXPROCS(1) - var item = counters.NewItem(60) + b.ReportAllocs() b.RunParallel(func(pb *testing.PB) { for pb.Next() { + var item = counters.NewItem(60) item.Increase() item.Sum() }