go-queue
go-queue copied to clipboard
slow then the golang's chan
code:
func Benchmark_Queue(b *testing.B) {
b.StopTimer()
queue := NewQueue(40960)
wg := &sync.WaitGroup{}
var count uint32
b.ResetTimer()
b.StartTimer()
wg.Add(20)
for i := 0; i < 10; i++ {
go func() {
defer wg.Done()
for j := 0; j < 100000; j++ {
for {
ok, _ := queue.Put(j)
if ok {
break
}
}
}
}()
go func() {
defer wg.Done()
for {
_, ok, _ := queue.Get()
if ok {
atomic.AddUint32(&count, 1)
}
if atomic.LoadUint32(&count) >= 1000000 {
return
}
}
}()
}
wg.Wait()
}
func Benchmark_Chan(b *testing.B) {
b.StopTimer()
ch := make(chan interface{}, 40960)
wg := &sync.WaitGroup{}
var count uint32
b.ResetTimer()
b.StartTimer()
wg.Add(20)
for i := 0; i < 10; i++ {
go func() {
defer wg.Done()
for j := 0; j < 100000; j++ {
ch <- j
}
}()
go func() {
defer wg.Done()
for {
<-ch
if atomic.AddUint32(&count, 1) == 1000000 {
close(ch)
}
if count >= 1000000 {
return
}
}
}()
}
wg.Wait()
}
result:
👍
已经在 MacPro M1 基于go1.17.12 上确认了”Chan 比 Queue 快”;
并没有用之前机器和go版本回归测试,初步结论是 chan 比以前快多了;
go1.8.3 的 chan 在高并发情况下,性能会急速下降,但在 go1.17.14 上发现高并发,chan性能下降缓慢。