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

114 lines
1.7 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 TestCursor(t *testing.T) {
c := newCursor()
ts := time.Now()
for i := 0; i < 100000000; i++ {
x := c.increment()
if x%1000000 == 0 {
fmt.Println(x)
}
}
tl := time.Since(ts)
fmt.Printf("time = %v\n", tl)
}
func TestCursor2(t *testing.T) {
c := newCursor()
var wg sync.WaitGroup
wg.Add(10000)
ts := time.Now()
for i := 0; i < 10000; i++ {
go func() {
for j := 0; j < 10000; j++ {
x := c.increment()
if x%10000000 == 0 {
fmt.Println(x)
}
}
wg.Done()
}()
}
wg.Wait()
fmt.Println(time.Since(ts))
}
func TestCursor3(t *testing.T) {
var c uint64
var wg sync.WaitGroup
wg.Add(10000)
ts := time.Now()
for i := 0; i < 10000; i++ {
go func() {
for j := 0; j < 10000; j++ {
x := atomic.AddUint64(&c, 1)
if x%10000000 == 0 {
fmt.Println(x)
}
}
wg.Done()
}()
}
wg.Wait()
fmt.Println(time.Since(ts))
}
type NoPad struct {
a uint64
b uint64
c uint64
}
func (np *NoPad) Increase() {
atomic.AddUint64(&np.a, 1)
atomic.AddUint64(&np.b, 1)
atomic.AddUint64(&np.c, 1)
}
type Pad struct {
a uint64
_p1 [8]uint64
b uint64
_p2 [8]uint64
c uint64
_p3 [8]uint64
}
func (p *Pad) Increase() {
atomic.AddUint64(&p.a, 1)
atomic.AddUint64(&p.b, 1)
atomic.AddUint64(&p.c, 1)
}
func BenchmarkPad_Increase(b *testing.B) {
pad := &Pad{}
b.RunParallel(func(pb *testing.PB) {
for pb.Next() {
pad.Increase()
}
})
}
func BenchmarkNoPad_Increase(b *testing.B) {
nopad := &NoPad{}
b.RunParallel(func(pb *testing.PB) {
for pb.Next() {
nopad.Increase()
}
})
}