上卷 程序设计
中卷 标准库
- bufio 1.18
- bytes 1.18
- io 1.18
- container 1.18
- encoding 1.18
- crypto 1.18
- hash 1.18
- index 1.18
- sort 1.18
- context 1.18
- database 1.18
- connection
- query
- queryrow
- exec
- prepare
- transaction
- scan & null
- context
- tcp
- udp
- http
- server
- handler
- client
- h2、tls
- url
- rpc
- exec
- signal
- embed 1.18
- plugin 1.18
- reflect 1.18
- runtime 1.18
- KeepAlived
- ReadMemStats
- SetFinalizer
- Stack
- sync 1.18
- atomic
- mutex
- rwmutex
- waitgroup
- cond
- once
- map
- pool
- copycheck
- nocopy
- unsafe 1.18
- fmt 1.18
- log 1.18
- math 1.18
- time 1.18
- timer
下卷 运行时
源码剖析
附录
文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
9.2.3 性能
将发往通道的数据打包,减少传输次数,可有效提升性能。
通道内部实现有锁和数据复制操作,单次发送更多数据(批处理),可改善性能。
const ( MAX = 50000000 // 数据统计上限。 BLOCK = 500 // 数据块大小。 CAP = 100 // 缓冲区大小。 ) //go:noinline func normal() { done := make(chan struct{}) c := make(chan int, CAP) go func() { defer close(done) count := 0 for x := range c { count += x } }() for i := 0; i < MAX; i++ { c <- i } close(c) <-done } //go:noinline func block() { done := make(chan struct{}) c := make(chan [BLOCK]int, CAP) go func() { defer close(done) count := 0 for a := range c { for _, x := range a { count += x } } }() for i := 0; i < MAX; i += BLOCK { // 使用数组对数据打包。 var b [BLOCK]int for n := 0; n < BLOCK; n++ { b[n] = i + n if i + n == MAX - 1 { break } } c <- b } close(c) <-done }
func BenchmarkNormal(b *testing.B) { for i := 0; i < b.N; i++ { normal() } } func BenchmarkBlock(b *testing.B) { for i := 0; i < b.N; i++ { block() } }
$ go test -bench . -benchmem BenchmarkNormal-2 1 6573974400 ns/op 1848 B/op 8 allocs/op BenchmarkBlock-2 8 138711262 ns/op 401528 B/op 3 allocs/op
测试并不严谨,有诸多干扰因素,结果也与数据量有关。仅供参考!
有关通道内部实现,可参考《源码剖析》。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论