我的问题是与我的同事就 C++ 与 C# 解决争论。
我们已经实现了一个接收大量 UDP 流的服务器。该服务器是用 C++ 开发的,使用异步套接字并使用完成端口重叠 I/O。我们使用 5 个完成端口和 5 个线程。该服务器可以轻松处理千兆网络上的 500 Mbps 吞吐量,而不会丢失任何数据包/错误(我们的测试没有超过 500 Mbps)。
我们尝试在 C# 中重新实现相同类型的服务器,但我们无法达到相同的传入吞吐量。我们使用异步接收 usingReceiveAsync
方法和池SocketAsyncEventArgs
来避免为每个接收调用创建新对象的开销。每个SAEventArgs
都设置了一个缓冲区,因此我们不需要为每个接收分配内存。池非常非常大,所以我们可以排队超过 100 个接收请求。此服务器无法处理超过 240 Mbps 的传入吞吐量。超过这个限制,我们会在 UDP 流中丢失一些数据包。
我的问题是:我应该期望使用 C++ 套接字和 C# 套接字具有相同的性能吗?我的观点是,如果在 .NET 中正确管理内存,它应该具有相同的性能。
附带问题:有人会知道一篇很好的文章/参考资料来解释 .NET 套接字如何在后台使用 I/O 完成端口吗?