2010-11-27 62 views
1

我正在构建一个消息路由器,并希望它尽可能快。 我想留在C#4.0中,并希望尽可能快地使用套接字。 我可能不需要将所有数据放入托管内存。 我处理的字节数组,并使用该方法(除非是更好的选择找到)正在使数据到管理的内存:http://www.codeproject.com/KB/cs/ReadingStructuresEmit.aspx在不安全的c#中使用Ws2_32.dll比使用.net套接字更快吗?

问题:

1)是否存在被不安全使用套接字性能提升?多少?

2)是使用这样的一个不安全的方法时(与所有的结构不安全以及)有一个的PInvoke或数据编排击中

public unsafe partial class Native 

{

[DllImport("Ws2_32.dll")] 
    public static extern int connect(SOCKET s, sockaddr_in* addr, int addrsize); 

}

3 )对于#2,数据处理是否发生在不安全的情况下以及何时不安全的方法返回时没有数据返回(也许什么都不是封送到托管)?

回答

5

这些改进措施不能产生任何可衡量的效果。 real工作是在内核模式下完成的,TCP/IP驱动程序堆栈中有很多层。那里有很多代码想要嗅探IRP数据包。最终它击中NIC。这就是真正的节流发生的地方。一个千兆以太网接口是常见的高端产品。这与花生相比,CPU可以铲除数据。即使是缓慢的RAM总线也能轻松将数据移动40倍。不要说实际上在连接到网络时发生延迟。

这些路径是由ws2_32.dll以及System.Net。你应该测量它。我的预测是,你看不到噪音的信号。

1

任何包装都会引入开销,所以是的,P /直接调用套接字库会更快。问题是速度要快多少。

您是否尝试过对每种方法进行基准测试并查看哪种性能更好?这将是一个很好的方法来确定这一点。如果性能差异可以忽略不计,那么坚持托管套接字类并保持代码可读性会更好。

+0

我还没有尝试过对它进行基准测试。我想知道在实施之前改进会有多大。 – Joe 2010-11-29 15:55:26

+0

我的猜测是改善不会引人注目。 – cdhowie 2010-11-29 15:57:13