Files
EdgeNode/internal/utils/counters/counter_test.go

199 lines
4.1 KiB
Go
Raw Normal View History

2024-07-27 15:42:50 +08:00
// Copyright 2023 GoEdge CDN goedge.cdn@gmail.com. All rights reserved. Official site: https://goedge.cloud .
package counters_test
import (
2024-07-27 15:42:50 +08:00
"runtime"
"runtime/debug"
"sync/atomic"
"testing"
"time"
"github.com/TeaOSLab/EdgeNode/internal/utils/counters"
"github.com/TeaOSLab/EdgeNode/internal/utils/testutils"
"github.com/iwind/TeaGo/assert"
2023-07-15 11:08:25 +08:00
"github.com/iwind/TeaGo/rands"
"github.com/iwind/TeaGo/types"
2023-07-15 11:08:25 +08:00
timeutil "github.com/iwind/TeaGo/utils/time"
)
func TestCounter_Increase(t *testing.T) {
var a = assert.NewAssertion(t)
2023-11-15 15:57:41 +08:00
var counter = counters.NewCounter[uint32]()
a.IsTrue(counter.Increase(1, 10) == 1)
a.IsTrue(counter.Increase(1, 10) == 2)
a.IsTrue(counter.Increase(2, 10) == 1)
counter.Reset(1)
a.IsTrue(counter.Get(1) == 0) // changed
a.IsTrue(counter.Get(2) == 1) // not changed
}
func TestCounter_IncreaseKey(t *testing.T) {
var a = assert.NewAssertion(t)
2023-11-15 15:57:41 +08:00
var counter = counters.NewCounter[uint32]()
a.IsTrue(counter.IncreaseKey("1", 10) == 1)
a.IsTrue(counter.IncreaseKey("1", 10) == 2)
a.IsTrue(counter.IncreaseKey("2", 10) == 1)
counter.ResetKey("1")
a.IsTrue(counter.GetKey("1") == 0) // changed
a.IsTrue(counter.GetKey("2") == 1) // not changed
}
func TestCounter_GC(t *testing.T) {
if !testutils.IsSingleTesting() {
return
}
2023-11-15 15:57:41 +08:00
var counter = counters.NewCounter[uint32]()
counter.Increase(1, 20)
time.Sleep(1 * time.Second)
counter.Increase(1, 20)
time.Sleep(1 * time.Second)
counter.Increase(1, 20)
counter.GC()
2023-12-24 15:11:09 +08:00
t.Log(counter.Get(1))
}
func TestCounter_GC2(t *testing.T) {
2023-07-15 11:08:25 +08:00
if !testutils.IsSingleTesting() {
return
}
2023-11-15 15:57:41 +08:00
var counter = counters.NewCounter[uint32]().WithGC()
2023-12-24 15:11:09 +08:00
for i := 0; i < 100_000; i++ {
2023-07-15 11:08:25 +08:00
counter.Increase(uint64(i), rands.Int(10, 300))
}
var ticker = time.NewTicker(1 * time.Second)
for range ticker.C {
t.Log(timeutil.Format("H:i:s"), counter.TotalItems())
if counter.TotalItems() == 0 {
break
}
}
}
2023-07-17 20:31:50 +08:00
func TestCounterMemory(t *testing.T) {
var stat = &runtime.MemStats{}
runtime.ReadMemStats(stat)
2023-11-15 15:57:41 +08:00
var counter = counters.NewCounter[uint32]()
2023-10-04 16:53:39 +08:00
for i := 0; i < 1_000_000; i++ {
2023-07-17 20:31:50 +08:00
counter.Increase(uint64(i), rands.Int(10, 300))
}
2023-10-04 16:53:39 +08:00
runtime.GC()
runtime.GC()
debug.FreeOSMemory()
2023-07-17 20:31:50 +08:00
var stat1 = &runtime.MemStats{}
runtime.ReadMemStats(stat1)
2023-12-24 16:08:57 +08:00
t.Log((stat1.HeapInuse-stat.HeapInuse)/(1<<20), "MB")
2023-10-04 16:53:39 +08:00
t.Log(counter.TotalItems())
2023-12-24 15:11:09 +08:00
var gcPause = func() {
var before = time.Now()
runtime.GC()
var costSeconds = time.Since(before).Seconds()
var stats = &debug.GCStats{}
debug.ReadGCStats(stats)
2023-12-25 16:41:07 +08:00
t.Log("GC pause:", stats.Pause[0].Seconds()*1000, "ms", "cost:", costSeconds*1000, "ms")
2023-12-24 15:11:09 +08:00
}
gcPause()
_ = counter.TotalItems()
2023-07-17 20:31:50 +08:00
}
func BenchmarkCounter_Increase(b *testing.B) {
runtime.GOMAXPROCS(4)
2023-11-15 15:57:41 +08:00
var counter = counters.NewCounter[uint32]()
2023-12-25 16:41:07 +08:00
b.ReportAllocs()
b.ResetTimer()
var i uint64
b.RunParallel(func(pb *testing.PB) {
for pb.Next() {
2023-12-25 16:41:07 +08:00
counter.Increase(atomic.AddUint64(&i, 1)%1_000_000, 20)
}
})
2024-07-27 15:42:50 +08:00
// b.Log(counter.TotalItems())
}
func BenchmarkCounter_IncreaseKey(b *testing.B) {
runtime.GOMAXPROCS(4)
2023-11-15 15:57:41 +08:00
var counter = counters.NewCounter[uint32]()
go func() {
var ticker = time.NewTicker(100 * time.Millisecond)
for range ticker.C {
counter.GC()
}
}()
b.ResetTimer()
2023-12-25 16:41:07 +08:00
b.ReportAllocs()
var i uint64
b.RunParallel(func(pb *testing.PB) {
for pb.Next() {
2023-12-25 16:41:07 +08:00
counter.IncreaseKey(types.String(atomic.AddUint64(&i, 1)%1_000_000), 20)
}
})
2024-07-27 15:42:50 +08:00
// b.Log(counter.TotalItems())
}
func BenchmarkCounter_IncreaseKey2(b *testing.B) {
runtime.GOMAXPROCS(4)
2023-11-15 15:57:41 +08:00
var counter = counters.NewCounter[uint32]()
go func() {
var ticker = time.NewTicker(1 * time.Millisecond)
for range ticker.C {
counter.GC()
}
}()
b.ResetTimer()
var i uint64
b.RunParallel(func(pb *testing.PB) {
for pb.Next() {
counter.IncreaseKey(types.String(atomic.AddUint64(&i, 1)%1e5), 20)
}
})
2024-07-27 15:42:50 +08:00
// b.Log(counter.TotalItems())
}
func BenchmarkCounter_GC(b *testing.B) {
runtime.GOMAXPROCS(4)
2023-11-15 15:57:41 +08:00
var counter = counters.NewCounter[uint32]()
for i := uint64(0); i < 1e5; i++ {
counter.IncreaseKey(types.String(i), 20)
}
b.ResetTimer()
b.RunParallel(func(pb *testing.PB) {
for pb.Next() {
counter.GC()
}
})
2023-07-15 11:08:25 +08:00
2024-07-27 15:42:50 +08:00
// b.Log(counter.TotalItems())
}