【问题标题】:C Windows buffer sizeC Windows 缓冲区大小
【发布时间】:2011-11-26 21:39:18
【问题描述】:

在 Windows 中,假设我正在使用 recv 函数从套接字接收数据。 我很好奇最佳缓冲区有多大?我可以使它成为1024 字节,或者我可以使它成为51200 字节,或者更大。我想知道哪个性能更好。

这不仅适用于recv 函数,假设我正在读取一个大文本文件,我想要一个非常大的缓冲区还是一个更小的缓冲区?

【问题讨论】:

    标签: c windows size buffer recv


    【解决方案1】:

    如果您在服务器类型的情况下不知道要在其上运行哪些服务,则可以使用不同大小的缓冲池数组,例如 [128,1024,4096,16384,65536] .当有东西连接时,使用 128 大小,如果所有 128 都进来,下次使用 1024.. 等等。

    在具有已知协议/负载的客户端或服务器上,只需猜测一下即可(与其他发帖人所建议的差不多:)

    Rgds, 马丁

    【讨论】:

      【解决方案2】:

      这取决于您期望的数据类型和您期望的协议。 例如,UDP 会一次性给你一个完整的数据包,因此最佳缓冲区大小可以是 1500。

      真正的性能障碍将是您将进行的函数调用(在本例中为recv)。为了提高性能,您可以从默认的大值开始,然后分析接收到的数据包大小。根据分析,您可以传递(几乎)“理想”的缓冲区大小。

      【讨论】:

        【解决方案3】:

        操作系统会执行自己的缓冲,因此缓冲区的大小并不重要。性能损失在于函数调用:1 字节缓冲区效率低下,因为它需要对recv() 进行太多调用。缓冲区太大只是浪费空间。

        最佳大小将是您希望在单个 recv() 调用中接收或能够处理的数据大小的两倍,下限约为 1 或 2 个 tcp 帧。

        我个人使用 4KB 缓冲区,但这是我自己的偏好,很大程度上取决于我正在编写的应用程序。

        【讨论】:

          【解决方案4】:

          操作系统已经缓冲了它,所以你最好每次只读取一个字节。

          【讨论】:

          • 每字节一个上下文切换不会给你任何“最佳性能奖”......
          猜你喜欢
          • 2017-04-07
          • 1970-01-01
          • 1970-01-01
          • 2012-06-07
          • 1970-01-01
          • 1970-01-01
          • 2020-09-05
          • 2014-06-10
          • 1970-01-01
          相关资源
          最近更新 更多