【问题标题】:How to define the optimal size of the buffer for a channel? [closed]如何定义通道缓冲区的最佳大小? [关闭]
【发布时间】:2021-11-17 09:54:18
【问题描述】:

我知道缓冲区的大小可以在应用程序性能中发挥重要作用,但是定义缓冲区大小的最佳方法是什么?调整大小时我应该考虑什么?

类似于“最佳实践”的东西

【问题讨论】:

  • 至少给出一些用例。
  • 这取决于用例。通道的许多用途都与无缓冲通道一起使用。
  • 最佳实践是:0 用于同步的无缓冲通道)。 1:当您想要分离发送和接收时,即从 1 中删除同步。 N>1:如果您有强烈的论据表明 N 是 that 特定用例的正确值。请注意,如果通道的缓冲区容量“在 [...您的] 应用程序性能中起重要作用”,那么您的设计就有问题。
  • 另外,您调整缓冲区大小以防止读者挨饿,等待一些数据到来。

标签: go channel goroutine


【解决方案1】:

为了证明缓冲区大小实际上是影响性能的一个重要因素,您必须测量性能并尝试不同的大小进行比较。到那时,您已经有了找到合适价值的方法(只需继续测试和比较)。

至于在确定频道大小时应该考虑什么,这可能是一个不同的问题。首先要考虑的是程序的正确性:意思是程序是否会按预期运行并且没有错误。正如 cmets 中提到的,在绝大多数情况下,“正确”值是 0 或 1,分别在同步和非同步通信中。

如果您的通道确实需要大于 1 的缓冲区大小,那么您必须确定通道必须一次保存的值的上限或“最坏情况”数量以避免死锁。如果您无法确定该数字确切是多少,则说明没有上限。例如,如果您有一个发送消息的递归例程,则可能没有上限。如果是这种情况,您必须重新设计您的程序以动态存储值,例如切片。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-22
    • 2012-11-06
    • 2023-03-24
    • 2012-02-06
    • 2012-08-10
    • 2010-12-05
    • 2013-03-10
    • 1970-01-01
    相关资源
    最近更新 更多