go-queue icon indicating copy to clipboard operation
go-queue copied to clipboard

slow then the golang's chan

Open chenjie199234 opened this issue 5 years ago • 2 comments

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:

企业微信截图_1c2b61f3-52d0-4cc0-af22-a5cbdb06e164

chenjie199234 avatar Jan 06 '21 04:01 chenjie199234

👍

leeson888 avatar Jul 02 '21 07:07 leeson888

已经在 MacPro M1 基于go1.17.12 上确认了”Chan 比 Queue 快”;

并没有用之前机器和go版本回归测试,初步结论是 chan 比以前快多了;
go1.8.3 的 chan 在高并发情况下,性能会急速下降,但在 go1.17.14 上发现高并发,chan性能下降缓慢。

yireyun avatar Jul 25 '22 07:07 yireyun