为了账号安全,请及时绑定邮箱和手机立即绑定

Go:缓冲通道总和更快?

Go:缓冲通道总和更快?

Go
梵蒂冈之花 2021-07-06 15:58:41
Go:缓冲通道总和更快?在以下游乐场链接中,http://play.golang.org/p/8OAbtn6koN一种方法包含缓冲通道,我预计它的性能会更好,因为它不等待同步。 ch := make(chan int, 2)对随机数数组求和的三种方法。我对这三个函数进行基准测试,如以下链接:http://play.golang.org/p/JK3yL4QwOJ我的期望是缓冲通道是异步的,除非通道已满,否则发送或接收不需要等待,因此缓冲通道总和比未缓冲通道总和性能更好,因为同步所有 goroutine 不需要任何时间。[问题 1] 所以我为缓冲通道 sum 函数提供了 3 个缓冲区大小,但基准测试结果如下:Benchmarklinear       10   122170091 ns/opBenchmarkchSum        20   121921287 ns/optesting: BenchmarkchSum left GOMAXPROCS set to 4BenchmarkchSumBuffer        20   118524619 ns/optesting: BenchmarkchSumBuffer left GOMAXPROCS set to 4ok    ~/Benchmark_sum_01  4.056s没有意义,为什么在这种情况下两个通道的总和表现相同?带缓冲区的应该表现更好吗?[问题2]如果我给 ch := make(chan int, 1)我得到Benchmarklinear       10   122170091 ns/opBenchmarkchSum        20   121921287 ns/optesting: BenchmarkchSum left GOMAXPROCS set to 4BenchmarkchSumBuffer        10   118524619 ns/optesting: BenchmarkchSumBuffer left GOMAXPROCS set to 4如果我给 ch := make(chan int, 2)我得到Benchmarklinear       10   122170091 ns/opBenchmarkchSum        10   121921287 ns/optesting: BenchmarkchSum left GOMAXPROCS set to 4BenchmarkchSumBuffer        20   118524619 ns/optesting: BenchmarkchSumBuffer left GOMAXPROCS set to 4但结果非常不一致。每次运行基准测试时,都会得到不同的结果。缓冲区大小与性能无关?为什么缓冲区大小为 2 的基准会给我不同的结果。随着缓冲区大小的增加,两个 goroutine 永远不会阻塞,因此似乎花费的时间更少。提前致谢。
查看完整描述

1 回答

?
慕码人8056858

TA贡献1803条经验 获得超6个赞

缺乏缓冲是无关紧要的。在无缓冲通道上有一个挂起的接收。因此,只要您在通道上发送一个值,它就会被接收,从而释放通道以供下一次发送。


查看完整回答
反对 回复 2021-07-12
  • 1 回答
  • 0 关注
  • 180 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信