新的Async方法和性能

时间:2011-06-03 12:52:57

标签: .net performance sockets asynchronous

.NET中的套接字类有一些新的异步方法(如Socket.ReceiveAsync)。

我正在努力了解他们的目的。据我了解,创建它们是为了避免为每个操作创建一个新的IAsyncResult对象。

假设我要创建一个高性能的HTTP服务器。然后我需要为每个操作创建一个Request或Response对象。而请求或响应对象肯定有一些属性,也可能是其他类(或只是基元+字符串)。我可能必须从数据库中获取信息(要创建更多对象)。

我的观点是每个请求/回复可以创建很多对象。 AsyncResult对象是否太重以至于会影响整个服务器的性能?或者MS是否意味着我应该为服务器中的所有对象使用flyweight模式(重用请求/回复对象而不是分配新对象)?

请赐教。

更新

从MSDN了解新的Async方法:

  

这些增强功能的主要功能是避免在高容量异步套接字I / O期间重复分配和同步对象。当前由System.Net.Sockets.Socket类实现的Begin / End设计模式需要为每个异步套接字操作分配System.IAsyncResult对象

来源:http://msdn.microsoft.com/en-us/library/system.net.sockets.socketasynceventargs.aspx

UPDATE2

这个问题不重复。我不是在问这个区别。我很清楚这种差异。如果他们添加了减少分配和GC工作的方法,我应该在套接字处理之上的协议层中做同样的事情吗?即我应该对像HttpReqest等对象使用flyweight模式。

2 个答案:

答案 0 :(得分:2)

在一个套接字生存期内,每个开始/结束操作都将分配新的同步对象。

例如,您的逻辑是,

// GET /default.aspx HTTP/1.1<cr-lf>
ReadLine for Http Verb and Version
// Headers
ReadLine till you get empty line and process header
// Data
Read or process mime data

现在,如果您注意到,我们将永远不会在一个开始/结束调用中读取所有内容,而是每个操作将调用多个开始/结束,这将创建新的同步对象。

但这些步骤仅适用于一个客户端/服务器通信。

所以你的请求/响应对象在socket的整个生命周期中只有一个,在这种情况下你最好使用新的Async方法并留下你的请求/响应对象 只是一个单一的对象。

当服务器同时处理1000个请求时,这肯定会影响性能。即使同步对象占用100个字节但分配/重新分配,gc处理器的使用都将影响1000个同时操作。

但是,对于内存管理存在设计良好的算法,如果您的服务器将长时间连续运行,它肯定会导致碎片并且确实会减慢速度。

答案 1 :(得分:0)

不是您问题的直接答案,但有一些关于技术ed异步的好的演示文稿。您必须创建登录才能查看它们

DEV324 C# and Visual Basic Future: Async Made Simple 5月18日星期三

DEV335 Improving Your Microsoft ASP.NET Application Performance with Asynchronous Pages and Actions 5月19日星期四