gpt4 book ai didi

c++ - 了解 fwrite() 的缓冲行为

转载 作者:IT王子 更新时间:2023-10-29 00:18:52 25 4
gpt4 key购买 nike

我正在使用函数调用 fwrite() 将数据写入 Linux 上的管道。

早些时候,fwrite() 被重复调用小块数据(平均 20 字节),缓冲留给 fwrite()。进程上的 strace 显示一次写入了 4096 字节的数据。

原来这个写的过程是我程序的瓶颈。所以我决定将代码中的数据缓冲到 64KB 的 block 中,然后使用 fwrite() 一次写入整个 block 。我使用 setvbuf() 将 FILE* 指针设置为“无缓冲”。

性能提升并没有我预期的那么显着。

更重要的是,strace 输出显示数据仍在一次写入 4096 字节。有人可以向我解释这种行为吗?如果我用 64KB 的数据调用 fwrite(),为什么它一次只写入 4096 个字节?

是否有替代 fwrite() 的方法来使用 FILE* 指针将数据写入管道?

最佳答案

4096 来自作为管道基础的 Linux 机器。它发生在两个地方。一是管道的容量。在旧版本的 Linux 上容量是一个系统页,在 32 位 i386 机器上是 4096 字节。 (在更现代的 Linux 版本上,容量为 64K。)

您会遇到 4096 字节问题的另一个地方是定义的常量 PIPE_BUF,保证以原子方式处理的字节数。在 Linux 上,这是 4096 字节。此限制的含义取决于您是否将管道设置为阻塞或非阻塞。执行 man -S7 pipe 以获取所有细节。

如果您正尝试以高速率交换大量数据,您可能需要重新考虑管道的使用。你在 Linux 机器上,所以共享内存是一个选项。您可以使用管道发送相对少量的数据作为信号机制。

关于c++ - 了解 fwrite() 的缓冲行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10311186/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com