Go:缓冲通道总和更快?

时间:2013-12-01 14:09:45

标签: concurrency go buffer benchmarking channel

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

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

缓冲区大小与性能无关?为什么带有buffersize 2的基准测试给出了不同的结果。有了更多的缓冲区大小,两个goroutine永远不会阻塞所以它似乎花费更少的时间。

提前致谢。

1 个答案:

答案 0 :(得分:0)

缺乏缓冲是无关紧要的。未缓冲的通道上有待处理的接收。因此,只要您在通道上发送一个值,就会收到该通道,从而释放下一次发送的通道。