我的问题是与我的同事讨论C++与C#的争论.
我们已经实现了一个接收大量UDP流的服务器.此服务器使用异步套接字和使用完成端口的重叠I/O在C++中开发.我们使用5个完成端口和5个线程.该服务器可以轻松处理千兆网络上的500 Mbps吞吐量,而不会丢失数据包/错误(我们没有将测试推送到500 Mbps以上).
我们尝试在C#中重新实现相同类型的服务器,但我们无法达到相同的传入吞吐量.我们使用异步接收使用ReceiveAsync方法和池SocketAsyncEventArgs来避免为每个接收调用创建新对象的开销.每个SAEventArgs都有一个缓冲区设置,所以我们不需要为每次接收分配内存.该池非常非常大,因此我们可以排队超过100个接收请求.此服务器无法处理超过240 Mbps的传入吞吐量.超过该限制,我们在UDP流中丢失了一些数据包.
我的问题是:我应该期望使用C++套接字和C#套接字获得相同的性能吗?我的观点是,如果在.NET中正确管理内存,它应该是相同的性能.
附带问题:有人会知道一篇很好的文章/参考资料,解释.NET套接字如何使用I/O完成端口吗?
我正在尝试优化一个以二进制格式序列化对象并将它们写入文件的类.我目前正在使用FileStream(由于我的对象的大小而处于同步模式)和BinaryWriter.这是我班级的样子:
public class MyClass
{
private readonly BinaryWriter m_binaryWriter;
private readonly Stream m_stream;
public MyClass()
{
// Leave FileStream in synchronous mode for performance issue (faster in sync mode)
FileStream fileStream = new FileStream(FilePath, FileMode.OpenOrCreate, FileAccess.Write, FileShare.ReadWrite, maxSize, false);
m_stream = fileStream;
m_binaryWriter = new BinaryWriter(m_stream);
}
public void SerializeObject(IMySerializableObject serializableObject)
{
serializableObject.Serialize(m_binaryWriter);
m_stream.Flush();
}
}
Run Code Online (Sandbox Code Playgroud)
在此代码上运行的探查器显示了良好的性能,但我想知道是否还有其他对象(或技术)可用于提高此类的性能.