登录
首页 >  Golang >  Go问答

为什么在两个通道上选择的时间比在单通道上选择的时间慢得多?

来源:stackoverflow

时间:2024-02-13 11:12:22 419浏览 收藏

在IT行业这个发展更新速度很快的行业,只有不停止的学习,才不会被行业所淘汰。如果你是Golang学习者,那么本文《为什么在两个通道上选择的时间比在单通道上选择的时间慢得多?》就很适合你!本篇内容主要包括##content_title##,希望对大家的知识积累有所帮助,助力实战开发!

问题内容

此单通道基准测试仅需要 2.545 ns/op

func benchmarksingleselect(b *testing.b) {
    ch := make(chan interface{}, 1)
    for i := 0; i < b.n; i++ {
        select {
        case <-ch:
        default:
        }
    }
}

但是这个具有两个通道的基准测试需要 35.85 ns/op

func BenchmarkMultiSelect(b *testing.B) {
    ch := make(chan interface{}, 1)
    ch2 := make(chan interface{}, 1)
    for i := 0; i < b.N; i++ {
        select {
        case <-ch:
        case <-ch2:
        default:
        }
    }
}

为什么是非线性的?


正确答案


通常,一个多个之间的差异是一个很大的跳跃。您的第一个构造可能涉及仅在仅监视单个通道时才可能进行的优化。如果您为所涉及的 3 和 4 个通道添加进一步的基准测试,您将会看到这一点:基准时间将大致呈线性,但只有一个通道是特殊的。

这确实是一个实现细节,具体的你必须检查/分析Go的源代码。 Spec: Select statements 中的一件事:

评估每个 cases 的通道,结果是一组要接收或发送的通道。由于存在 default 情况,编译器必须检查是否有任何通信操作已准备好继续进行。在涉及多个通道的一般情况下,这需要一个循环和一些收集就绪情况的数据结构(例如切片或位图)。在单通道的情况下,编译器可能会生成更高效的代码,不涉及循环,并且不需要一组来收集就绪的情况,生成的代码只需要检查单个通道。

以上就是本文的全部内容了,是否有顺利帮助你解决问题?若是能给你带来学习上的帮助,请大家多多支持golang学习网!更多关于Golang的相关知识,也可关注golang学习网公众号。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>