142 lines
3.0 KiB
Go
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)
|
|
}
|