英文:
Go : buffered channel sum is faster?
问题
Go:缓冲通道的求和更快吗?
在下面的playground链接中,
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永远不会阻塞,所以看起来需要更少的时间。
提前感谢。
英文:
Go : buffered channel sum is faster?
On the following playground link,
http://play.golang.org/p/8OAbtn6koN
One method contains buffered channel, and I expected this to perform better because it does not wait for synchronization.
ch := make(chan int, 2)
Three methods that sums an array of random numbers. I benchmark these three functions like the following link:
http://play.golang.org/p/JK3yL4QwOJ
My expection was Buffered channel is Asynchronous and sending or receiving need not wait unless the channel is full, so the buffured channel sum performs better than unbuffered channel sum because it does not take any time to synchronize all goroutines.
[Question 1]
So I gave 3 buffer size for buffered channel sum function but the benchmark result is like the following:
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
It does not make sense, why in this case the two channel sum perform the same? Should the one with buffer perform better?
[Question 2]
If I give
ch := make(chan int, 1)
I get
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
If I give
ch := make(chan int, 2)
I get
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
But the result is very inconsistent. Everytime I run the benchmark test, I get a different result.
buffer size does not relate to the performance? Why the benchmark with buffersize 2 gives me different results. With more buffer size, two goroutines never blocks so it seems to take less time.
Thanks in advance.
答案1
得分: 0
缓冲区的缺失是无关紧要的。在无缓冲通道上有一个待接收的操作。因此,一旦你在通道上发送一个值,它就会被接收,这样就释放了通道,可以进行下一次发送。
英文:
The lack of buffering is inconsequential. There is a pending receive on the unbuffered channel. Therefore, as soon as you send a value on the channel it is received, which frees the channel for the next send.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论