feat(common): 添加无锁并发工具包依赖
新增 lockfree-1.1.3 工具包到 go.work 文件中,为项目提供无锁并发数据结构支持, 提升高并发场景下的性能表现。
This commit is contained in:
113
common/utils/lockfree-1.1.3/cursor_test.go
Normal file
113
common/utils/lockfree-1.1.3/cursor_test.go
Normal file
@@ -0,0 +1,113 @@
|
||||
/*
|
||||
* 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()
|
||||
}
|
||||
})
|
||||
}
|
||||
Reference in New Issue
Block a user