concurrency - 转到 : buffered channel sum is faster?

标签 concurrency go buffer benchmarking channel

Go:缓冲 channel 总和更快?

在下面的 playground 链接中,

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

一个方法包含缓冲 channel ,我希望它的性能更好,因为它不等待同步。

 ch := make(chan int, 2)

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

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

我的预期是缓冲 channel 是异步的,除非 channel 已满,否则发送或接收不需要等待,因此缓冲 channel 总和比非缓冲 channel 总和表现更好,因为同步所有 goroutine 不需要任何时间。

[问题一] 所以我为缓冲 channel 总和函数提供了 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

没有意义,为什么在这种情况下两个 channel 的总和表现相同?有缓冲区的应该性能更好吗?

[问题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 的基准测试给出了不同的结果。随着缓冲区大小的增加,两个 goroutines 永远不会阻塞,因此看起来花费的时间更少。

提前致谢。

最佳答案

缺乏缓冲是无关紧要的。无缓冲 channel 上有待处理的接收。因此,一旦您在 channel 上发送了一个值,它就会被接收,从而为下一次发送释放 channel 。

关于concurrency - 转到 : buffered channel sum is faster?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20313007/

相关文章:

java - 分布式任务队列中的并发(生产者/消费者)

go - 在 Go 中存储 channel 数据

sockets - NodeJS : What is the proper way to handling TCP socket streams ? 我应该使用哪个定界符?

sql-server - SSIS:FTP 任务 - 并发连接

java - 读写锁

algorithm - 在分布式系统中复制文件,以便所有服务器都有所有文件的副本

go - 在 Go 文本模板中遍历 map

json - 戈朗 : JSON: How do I unmarshal array of strings into []int64

Java 来自套接字 NIO ByteBuffer 的部分消息处理

python - 使用 python io 从缓冲流组成行读取器