如何正确创建写缓冲区?目前,我正在使用已分配缓冲区的链接列表,但大多数写入只是几个字节。您对创建高效写缓冲区有何建议?
答案 0 :(得分:3)
链接列表可能不是这里的最佳选择。它的遍历不是缓存友好的,因此很昂贵。
你可以使用一个环形缓冲区[1],一些消费者将原始字节放入其中,一些生产者稍后将获取整个可用内容并将其发送到一个系统调用中。
如果不希望写入连续内存区域(例如,您无法以零复制方式执行),则可以将struct iovec引用您的内存放入环形缓冲区。消费者将抓住所有iovec并将其传递给writev [2]。
说到生产者和消费者,他们可能是操作系统级别的线程,你必须在缓冲区周围同步它们,或者它们可能是光纤[3]。如果您正在执行事件驱动的应用程序,则后者更可取。我有一个专门针对libev的光纤实现[4]你可以看一下。它还包括有效的虚拟环缓冲区实现。
参考文献: