C# .Net 下通过缓存提高TCP传输速度
来源:互联网 发布:c语言二进制转base64 编辑:程序博客网 时间:2024/05/08 02:09
.net 提供了一个NetworkStream 用于TCP 的读写,实际使用时发现直接操作效率很低,哪怕把TCP 的发送缓存和接受缓存设置很大也没有太大提高。后来在对 NetworkStream 读写前设置了缓存,性能一下子提高了很多。
从实际测试结果看设置自己的写缓存,对性能的提升最为显著。我分析了一下,其原因很可能是在向NetworkStream 序列化对象时,序列化程序调用了大量的Write 方法向NetworkStream写入数据,每次向NetworkStream写入数据,数据被首先写入TCP的发送缓存,并且由调用线程设置一个信号通知.Net Framework 内部的TCP线程发送缓冲区中已经有数据,TCP线程被激活并读取发送缓冲区中的数据,组包并向网卡写入数据。频繁的调用 NetworkStream.Write 写入小块数据将导致调用线程和TCP线程反复切换,并大量触发网卡中断,导致发送效率低下。如果我们在发送前将数据缓存并按较大的数据块发送给TCP线程,则大大减少线程切换和网卡中断数量,从而大大提高传输效率。
问题到这里还没有结束,我们发送的对象往往较大,如果我们将发送对象全部序列化到buffer中再发送,那么势必占用大量内存,实际上我们无法忍受这种对内存无限制申请的行为,试想一个1G大小的对象,我们在发送前为它另外再开辟1个G的内存来缓存,对于系统来说简直是无法忍受。由于我们用.net 发送数据,我们在发送时需要将对象序列化到流中,而不能像 C/C++那样直接通过指针来读取数据(当然你也可以用unsafe代码,但这种方式会带来其他问题,而且并不为大家所推荐),所以我们需要开发一个专门用 TCP 发送缓存的流来处理读写前的缓存。为此我开发了一个 TcpCacheStream 类,这个类被用在读写 NetworkStream 前先进行缓存。
调用方法很简单
TcpCacheStream 类为调用者封装了缓存的过程,这个缓存过程实际并不复杂,发送时数据先写入TcpCacheStream的buf中,当buf满后才向 NetworkStream 写入数据,否则只缓存。由于最后一包不能保证正好填满buf,我们在写入数据后一定要调用 Flush 方法,将所有数据都发送出去。接收的过程反过来,如果buf中没有数据,就先将数据读入到buf中,然后再COPY给调用者,如果已经有数据则直接 COPY给调用者。
TcpCacheStream 的代码如下:
- C# .Net 下通过缓存提高TCP传输速度
- .Net 下通过缓存提高TCP传输速度
- .Net 下通过缓存提高TCP传输速度
- .Net 下通过缓存提高TCP传输速度
- .Net 下通过缓存提高TCP传输速度
- .Net 下通过缓存提高TCP传输速度
- 如何利用缓存提高asp.net网站访问速度
- 如何利用缓存提高asp.net网站访问速度
- ASP.NET缓存Cache的应用-提高数据库读取速度
- TCP传输速度的计算
- Linux中通过缓存DNS的解析来提高上网的响应速度!
- Linux中通过缓存DNS的解析来提高上网的响应速度!
- Linux中通过缓存DNS的解析来提高上网的响应速度!
- Linux中通过缓存DNS的解析来提高上网的响应速度!
- 如何通过关闭superfetch减小Win7备用缓存提高电脑速度
- 提高光耦传输速度的方法
- 提高FTP传输速度小技巧
- ASP.NET C# 通过URL加密解密传输数据
- FireFox插件和扩展开发(二)——编写和使用XPCOM组件
- 今天星期五,马上就该休息了啊
- Oracle总结
- wmware linux 网卡问题
- 处理教材:Introduction to Objects of "Thinking in Java"
- C# .Net 下通过缓存提高TCP传输速度
- 单选按钮的用法
- [技术分享 – FCS 篇] 驭龙五式:实战 FCS 服务器和客户端部署 —— 开篇
- 当前安全设置不允许下载该文件
- 自由 祖国
- flex 各组件对应的样式属性 上
- flex 各组件对应的样式属性 中
- [技术分享 – FCS 篇] 驭龙五式1之龙之将至:准备测试环境
- [技术分享 – FCS 篇] 驭龙五式2之乘龙配凤:安装配置 WSUS