我之前从未真正使用过COM套接字,现在有一些代码正在监听相当稳定的数据流(500Kb / s - 2000Kb / s)。
我尝试过不同的尺寸,但我不确定我在概念上做了什么。
byte[] m_SocketBuffer = new byte[4048];
//vs
byte[] m_SocketBuffer = new byte[8096];
我正在使用的套接字是System.Net.Sockets.Socket,这是我的构造函数:
new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
我的问题是:
我正在检索这样的数据:
string socketData = Encoding.ASCII.GetString(m_SocketBuffer, 0, iReceivedBytes)
while (sData.Length > 0)
{ //do stuff }
答案 0 :(得分:3)
简短版本:
回复:您的具体问题:
- 对于大缓冲区和小缓冲区是否存在一般权衡?
醇>
可能最明显的是通常的情况:比实际需要的缓冲区更大的只是浪费空间。
使缓冲区太小会强制执行更多I / O操作,可能会强制执行更多线程上下文切换(取决于您执行I / O的方式),并确保增加必须执行的程序语句数。
当然还有其他权衡因素,但是对于这个论坛来说,进入每一个论坛都会有太多的讨论。
- 如何评估缓冲区的大小?你应该用什么作为衡量标准?
醇>
我从一个似乎“合理”的大小开始,然后从那里进行实验。在各种负载测试场景中调整缓冲区大小,增加和减少,以查看对性能有何影响。
- 当缓冲区已满时,我的阅读事件会发生吗?就像套接字缓冲区达到阈值时那样,那时我可以从中读取它?
醇>
当您从套接字读取时,网络层将尽可能多地将数据放入缓冲区。如果有更多数据可用,则填充缓冲区。如果可用的数据少于适合的数量,则操作将在不填充缓冲区的情况下完成(但总是在缓冲区中至少放入一个字节时...读取操作以零长度完成的唯一时间是连接时关闭)