我正在构建一个消息路由器,并希望它尽可能快。 我想留在 c# 4.0 内,并希望尽快使用套接字。 我可能不需要将所有数据都放入托管内存中。 我正在处理字节数组并使用此方法将数据放入托管内存(除非找到更好的选择):http://www.codeproject.com/KB/cs/ReadingStructuresEmit.aspx
问题:
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,如果数据处理发生在不安全的环境中,并且当不安全的方法返回时没有返回数据(所以可能没有任何内容被编码到托管中),这有关系吗?
最佳答案
这些改进无法产生任何可衡量的效果。 真正的工作是在内核模式下完成的,即 TCP/IP 驱动程序堆栈中的许多层。那里有很多代码想要嗅探 IRP 数据包。最终它会攻击 NIC。这就是真正的节流发生的地方。一个千兆以太网接口(interface)是常见的高端。与 CPU 处理数据的速度相比,这微不足道。即使是较慢的 RAM 总线也可以轻松地将数据移动速度提高 40 倍。更不用说连接到网络后实际建立连接所涉及的延迟。
这些路径由 ws2_32.dll 和 System.Net 采用。你应该测量它。我的预测是您看不到噪音中的信号。
关于c# - 在不安全的 c# 中使用 Ws2_32.dll 是否比使用 .net 套接字更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4294053/