新的Async方法和性能

jga*_*fin 6 .net sockets performance 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工作的方法,我应该在套接字处理之上的协议层中做同样的事情吗?即我应该使用flyweight模式HttpReqest等对象等.

Aka*_*ava 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
Run Code Online (Sandbox Code Playgroud)

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

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

因此,您的请求/响应对象在套接字的整个生命周期中将只是一个,在这种情况下,您最好使用新的异步方法,并将您的请求/响应对象保留为一个对象。

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

不管内存管理的算法设计得多么好,如果你的服务器长时间连续运行,肯定会产生碎片,速度也会变慢。