如何定义通道缓冲区的最佳大小? [关闭]

Posted

技术标签:

【中文标题】如何定义通道缓冲区的最佳大小? [关闭]【英文标题】: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 特定用例的正确值。请注意,如果通道的缓冲区容量“在 [...您的] 应用程序性能中起重要作用”,那么您的设计就有问题。 另外,您调整缓冲区大小以防止读者挨饿,等待一些数据到来。 【参考方案1】:

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

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

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

【讨论】:

以上是关于如何定义通道缓冲区的最佳大小? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

write(2)最佳的缓冲大小

Golang:为啥增加缓冲通道的大小会消除我的 goroutine 的输出?

读-处理-写的最佳缓冲区大小

Java NIO之Buffer

malloc如何在编译时和运行时处理? [关闭]

NIO通道简介