Files
bl/common/utils/lockfree-1.1.3/channel_test.go
昔念 269256a861 feat(common): 添加无锁并发工具包依赖
新增 lockfree-1.1.3 工具包到 go.work 文件中,为项目提供无锁并发数据结构支持,
提升高并发场景下的性能表现。
2025-12-05 00:36:28 +08:00

142 lines
3.0 KiB
Go

/*
* Copyright (C) THL A29 Limited, a Tencent company. All rights reserved.
*
* SPDX-License-Identifier: Apache-2.0
*
*/
package lockfree
import (
"fmt"
"sync"
"sync/atomic"
"testing"
"time"
)
func BenchmarkChan(b *testing.B) {
var (
length = 1024 * 1024
goSize = GoSize
numPerGo = SchPerGo
counter = uint64(0)
wg sync.WaitGroup
)
ch := make(chan uint64, length)
// 消费端
go func() {
var ts time.Time
var count int32
for {
<-ch
atomic.AddInt32(&count, 1)
if count == 1 {
ts = time.Now()
}
//if x%10000000 == 0 {
// fmt.Printf("read %d\n", x)
//}
if count == int32(goSize*numPerGo) {
tl := time.Since(ts)
fmt.Printf("read time = %d ms\n", tl.Milliseconds())
}
}
}()
wg.Add(b.N)
b.ResetTimer()
for i := 0; i < b.N; i++ {
go func() {
for j := 0; j < numPerGo; j++ {
x := atomic.AddUint64(&counter, 1)
ch <- x
}
wg.Done()
}()
}
wg.Wait()
}
func TestChan1(t *testing.T) {
var (
t1_10us = uint64(0) // 1-10微秒
t10_100us = uint64(0) // 10-100微秒
t100_1000us = uint64(0) // 100-1000微秒
t1_10ms = uint64(0) // 1-10毫秒
t10_100ms = uint64(0) // 10-100毫秒
t100_ms = uint64(0) // 大于100毫秒
)
var (
length = 1024 * 1024
goSize = GoSize
numPerGo = SchPerGo
counter = uint64(0)
slower = uint64(0)
wg sync.WaitGroup
)
ch := make(chan uint64, length)
// 消费端
go func() {
var ts time.Time
var count int32
for {
x := <-ch
atomic.AddInt32(&count, 1)
if count == 1 {
ts = time.Now()
}
if x%1000000 == 0 {
fmt.Printf("read %d\n", x)
}
if count == int32(goSize*numPerGo) {
tl := time.Since(ts)
fmt.Printf("read time = %d ms\n", tl.Milliseconds())
}
}
}()
wg.Add(goSize)
totalS := time.Now()
for i := 0; i < goSize; i++ {
go func() {
for j := 0; j < numPerGo; j++ {
x := atomic.AddUint64(&counter, 1)
ts := time.Now()
ch <- x
tl := time.Since(ts)
ms := tl.Microseconds()
if ms > 1 {
atomic.AddUint64(&slower, 1)
if ms < 10 { // t1_10us
atomic.AddUint64(&t1_10us, 1)
} else if ms < 100 {
atomic.AddUint64(&t10_100us, 1)
} else if ms < 1000 {
atomic.AddUint64(&t100_1000us, 1)
} else if ms < 10000 {
atomic.AddUint64(&t1_10ms, 1)
} else if ms < 100000 {
atomic.AddUint64(&t10_100ms, 1)
} else {
atomic.AddUint64(&t100_ms, 1)
}
}
}
wg.Done()
}()
}
wg.Wait()
totalL := time.Since(totalS)
fmt.Printf("write total time = [%d ms]\n", totalL.Milliseconds())
time.Sleep(time.Second * 3)
fmt.Printf("slow ratio = %.2f \n", float64(slower)*100.0/float64(counter))
fmt.Printf("quick ratio = %.2f \n", float64(goSize*numPerGo-int(slower))*100.0/float64(goSize*numPerGo))
fmt.Printf("[<1us][%d] \n", counter-slower)
fmt.Printf("[1-10us][%d] \n", t1_10us)
fmt.Printf("[10-100us][%d] \n", t10_100us)
fmt.Printf("[100-1000us][%d] \n", t100_1000us)
fmt.Printf("[1-10ms][%d] \n", t1_10ms)
fmt.Printf("[10-100ms][%d] \n", t10_100ms)
fmt.Printf("[>100ms][%d] \n", t100_ms)
}