小编Tar*_*rel的帖子

如何有效利用渠道

我在Uber 的风格指南上读到,一个人最多应该使用 1 的通道长度。

虽然我很清楚使用 100 或 1000 的通道大小是非常糟糕的做法,但我想知道为什么通道大小为 10 不被视为有效选项。我错过了一些部分来得出正确的结论

在下面,您可以遵循由一些基准测试支持的我的论点(和反论点)。

我知道,如果您负责从该通道写入或读取的两个 go-routines 将在顺序写入或读取到/从通道之间被其他一些 IO 操作中断,则预计不会从更高的通道获得收益缓冲,我同意 1 是最好的选择。

但是,可以说,除了由通道写入/读取引起的隐式锁定和解锁之外,不需要其他重要的 go-routine 切换。那么我总结如下:

在使用大小为 1 和 10 的通道缓冲区(GR = go-routine)的通道上处理 100 个值时,考虑上下文切换的数量

  • 缓冲区=1:(GR1 插入 1 个值,GR2 读取 1 个值)X 100 ~ 200 个 go-routine 切换
  • Buffer=10:(GR1 插入 10 个值,GR2 读取 10 个值)X 10 ~ 20 个 go-routine 开关

我做了一些基准测试来证明这实际上速度更快:

package main

import (
    "testing"
)

type a struct {
    b [100]int64
}

func BenchmarkBuffer1(b *testing.B) {
    count …
Run Code Online (Sandbox Code Playgroud)

optimization performance benchmarking go channels

1
推荐指数
1
解决办法
81
查看次数

标签 统计

benchmarking ×1

channels ×1

go ×1

optimization ×1

performance ×1