阅读 s 的SendAsync
方法BeginAsync
说明Socket
,我意识到有人建议将SocketAsyncEventArgs
实例池化,说它比 BeginXX、EndXX 异步方法更好,因为每个调用都会创建一个IAsyncResult
实例。
我认为汇集可以轻松实例化的对象(例如SocketAsyncEventArgs
)并不是一个好习惯。对象分配非常快,并且 GC 被优化以有效地处理短期对象。我尝试实现一个池化机制来看看它是如何执行的,实际上在简单对象上分配更快,这些对象除了将一些数据封装在 ctor 中之外什么都不做。(嗯,这就像通过发送数十亿条SELECT 1
语句来分析 DBMS,这就是我在这里的原因。)
我不是在问哪个更好,我相信分析实际应用程序会产生答案,但只是对汇集简单的短期对象的好处感到好奇。更好的 GC 性能?内存碎片少?在设计时是否值得考虑?
来自MSDN
这些增强的主要特点是避免在大容量异步套接字 I/O 期间重复分配和同步对象。目前由 System.Net.Sockets.Socket 类实现的 Begin/End 设计模式要求为每个异步套接字操作分配一个 System.IAsyncResult 对象。
在新的 System.Net.Sockets.Socket 类增强中,异步套接字操作由应用程序分配和维护的可重用 SocketAsyncEventArgs 对象描述。高性能套接字应用程序最清楚必须维持的重叠套接字操作的数量。应用程序可以创建所需的任意数量的 SocketAsyncEventArgs 对象。例如,如果服务器应用程序需要始终有 15 个未完成的套接字接受操作以支持传入的客户端连接速率,则它可以为此目的分配 15 个可重用的 SocketAsyncEventArgs 对象。
谢谢。