【发布时间】:2021-08-29 22:26:59
【问题描述】:
我了解到 Golang 频道实际上比该语言提供的许多替代方案要慢。当然,它们确实很容易掌握,但是因为它们是高级结构,所以会带来一些开销。
阅读一些关于它的文章,我发现有人对频道进行基准测试here。他基本上说通道可以传输10 MB / s,这当然必须依赖于他的硬件。然后他说了一些我还没有完全理解的话:
如果您只想使用通道快速移动数据,那么移动它 1 一次一个字节是不明智的。您对频道的真正作用是 移动数据的所有权,在这种情况下,数据速率可以 实际上是无限的,取决于你的数据块的大小 转移。
我在多个地方都看到过这种“移动数据所有权”,但我还没有看到一个可靠的例子来说明如何做到这一点,而不是移动数据本身。
我想看一个例子来了解这个最佳实践。
【问题讨论】:
-
通道避免了数据竞争(对相同数据的并发读取和写入,这可能导致不可预测和/或格式错误的读取/写入)。通道读取或写入的约定——即使读取/写入来自不同的 goroutine——读取/写入是原子的,因此避免了数据竞争。
-
"我了解到 Golang 通道实际上比该语言提供的许多替代方案要慢。当然,它们确实很容易掌握,但是由于它们是高级结构,因此会带来一些开销。”这是一个严重的过度简化(即使是真的)完全无趣,因为您的问题将是编写正确代码。痴迷于“速度”是不健康的。尤其是考虑到渠道足够快。如果没有基准来证明您的渠道是应用程序瓶颈,考虑渠道速度是浪费时间。
-
@Volker 但是为什么问这个有问题?这是一个完全有效的问题。如果有人已经确定渠道是他们的瓶颈怎么办?他们会发现这个问题很有用。已经有有趣的答案了。
-
“如果有人已经确定渠道是他们的瓶颈怎么办?”这与发现硬件 CPU 错误一样可能。可能但不太可能。问没有错,只是可能是在错误的时间问错了问题。学习一门语言时,过度关注“速度”或“性能”会导致糟糕的代码、坏习惯和损坏的软件。把软件弄好真是太难了。速度应该是第二个关注点,至少在学习期间是这样。
标签: go