我正在构建一个消息路由器,并希望它尽可能快.我希望保持在c#4.0内,并希望尽快使用套接字.我可能不需要将所有数据都带入托管内存.我正在处理字节数组并使用此方法将数据带入托管内存(除非找到更好的选项):http://www.codeproject.com/KB/cs/ReadingStructuresEmit.aspx
问题:
1)使用不安全的套接字是否有性能提升?多少?
2)当使用这样的不安全方法时,是否存在pinvoke或数据封送(所有结构都不安全)
public unsafe partial class Native
Run Code Online (Sandbox Code Playgroud)
{
[DllImport("Ws2_32.dll")]
public static extern int connect(SOCKET s, sockaddr_in* addr, int addrsize);
Run Code Online (Sandbox Code Playgroud)
}
3)对于#2,如果数据处理在不安全的情况下发生并且当不安全的方法返回时没有返回任何数据(那么可能没有任何内容被编组到托管中)是否重要?
这些改进不能产生任何可测量的效果.在真正的工作是在内核模式下完成的,在TCP/IP驱动程序堆栈的许多层.那里有很多代码想要嗅探IRP数据包.最终它击中了NIC.这就是真正的限制发生的地方.千兆以太网接口是常见的高端接口.这是花生与CPU可以挖掘数据的速度相比较.即使是慢速RAM总线也可以轻松地将数据移动40倍.更不用说一旦它到达网络就实际建立连接所涉及的延迟.
这些路径由ws2_32.dll和System.Net采用.你应该测量它.我的预测是你无法看到噪音信号.