Go:缓冲通道总和更快?

Posted

技术标签:

【中文标题】Go:缓冲通道总和更快?【英文标题】:Go : buffered channel sum is faster? 【发布时间】:2013-12-17 06:12:24 【问题描述】:

Go : 缓冲通道总和更快?

在以下游乐场链接上,

http://play.golang.org/p/8OAbtn6koN

一个方法包含缓冲通道,我希望它执行得更好,因为它不等待同步。

 ch := make(chan int, 2)

对随机数数组求和的三种方法。我对这三个函数进行了基准测试,如下链接:

http://play.golang.org/p/JK3yL4QwOJ

我的期望是缓冲通道是异步的,除非通道已满,否则发送或接收无需等待,因此缓冲通道总和比无缓冲通道总和性能更好,因为它不需要任何时间来同步所有 goroutine。

[问题 1] 所以我给缓冲通道求和函数提供了 3 个缓冲区大小,但基准测试结果如下:

Benchmarklinear       10   122170091 ns/op
BenchmarkchSum        20   121921287 ns/op
testing: BenchmarkchSum left GOMAXPROCS set to 4
BenchmarkchSumBuffer        20   118524619 ns/op
testing: BenchmarkchSumBuffer left GOMAXPROCS set to 4
ok    ~/Benchmark_sum_01  4.056s

这没有意义,为什么在这种情况下两个通道和执行相同?带缓冲的那个应该表现更好吗?

[问题2]

如果我给了

 ch := make(chan int, 1)

我明白了

Benchmarklinear       10   122170091 ns/op
BenchmarkchSum        20   121921287 ns/op
testing: BenchmarkchSum left GOMAXPROCS set to 4
BenchmarkchSumBuffer        10   118524619 ns/op
testing: BenchmarkchSumBuffer left GOMAXPROCS set to 4

如果我给了

 ch := make(chan int, 2)

我明白了

Benchmarklinear       10   122170091 ns/op
BenchmarkchSum        10   121921287 ns/op
testing: BenchmarkchSum left GOMAXPROCS set to 4
BenchmarkchSumBuffer        20   118524619 ns/op
testing: BenchmarkchSumBuffer left GOMAXPROCS set to 4

但是结果很不一致。每次我运行基准测试,我都会得到不同的结果。

缓冲区大小与性能无关?为什么缓冲区大小为 2 的基准测试给了我不同的结果。随着缓冲区大小的增加,两个 goroutine 永远不会阻塞,因此似乎花费的时间更少。

提前致谢。

【问题讨论】:

【参考方案1】:

没有缓冲是无关紧要的。无缓冲通道上有一个挂起的接收。因此,一旦您在通道上发送了一个值,它就会被接收,这会释放通道以进行下一次发送。

【讨论】:

以上是关于Go:缓冲通道总和更快?的主要内容,如果未能解决你的问题,请参考以下文章

Go中缓冲通道和非缓冲通道的测距有啥区别?

Go中缓冲通道的死锁

go-runtime 不会将对象推出缓冲通道

024_go语言中的缓冲通道

go缓冲区

[Go] golang缓冲通道实现资源池