Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 新的异步方法和性能_.net_Performance_Sockets_Asynchronous - Fatal编程技术网

.net 新的异步方法和性能

.net 新的异步方法和性能,.net,performance,sockets,asynchronous,.net,Performance,Sockets,Asynchronous,NET中的套接字类有一些新的异步方法(如socket.ReceiveAsync) 我在努力理解他们的目的。据我所知,创建它们是为了避免为每个操作创建新的IAsyncResult对象 假设我要创建一个高性能HTTP服务器。然后我需要为每个操作创建一个请求或响应对象。请求或响应对象当然有一些属性,这些属性也可能是其他类(或者只是原语+字符串)。我可能需要从数据库中获取信息(要创建更多对象) 我的观点是,每个请求/回复可以创建相当多的对象。AsyncResult对象是否太重以至于会影响整个服务器的性能

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

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

假设我要创建一个高性能HTTP服务器。然后我需要为每个操作创建一个请求或响应对象。请求或响应对象当然有一些属性,这些属性也可能是其他类(或者只是原语+字符串)。我可能需要从数据库中获取信息(要创建更多对象)

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

请开导我

更新 从MSDN了解新的异步方法:

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

资料来源:

更新2
这个问题不是重复的。我不是在问区别。我很清楚两者的区别。如果他们添加了减少GC分配和工作的方法,那么我应该在套接字处理之上的协议层中也这样做吗?i、 e.我是否应该将flyweight模式用于
HttpReqest
等对象。

不是对您问题的直接回答,但在tech ed上有几个关于async的精彩演示。您必须创建登录才能查看它们

五月十八日(星期三)


5月19日星期四

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

比如你的逻辑是,

// 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
//GET/default.aspx HTTP/1.1
Http谓词和版本的ReadLine
//标题
读取行,直到得到空行和进程标题
//资料
读取或处理mime数据
现在,如果您注意到,我们将永远不会在一个begin/end调用中读取所有内容,而是每个操作将调用多个begin/end,这将创建新的sync对象

但是,所有这些步骤仅适用于一个客户机/服务器通信

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

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


无论内存管理有多么完善的算法,如果您的服务器将长时间连续运行,它肯定会导致碎片,并且会减慢速度

我的理解是,之所以提供
ReceiveAsync
,是因为有那么多人在
IAsyncResult
等问题上苦苦挣扎,而不是因为
AsyncResult
的任何“沉重”…亚历克斯·特纳几周前在teched做了一个关于异步的演讲,可能想了解他:这里讨论得很好(都是关于语义和性能的差异):@Mark Gravell:检查我的更新。
async
API是第三个选项……我的意思是:它不能帮助我们理解现有的2(这就是我理解问题的方式)啊,是的,这对我来说是100%的新鲜事,我不知道它们是不同的TTP可能是一个坏例子。让我们说SIP协议,它涉及很多对象(事务、同一请求/回复的多条消息、会话)等等。我应该为所有这些创建池吗?我什么时候知道何时可以缩小池(即处理重复使用的对象)?每个通信步骤的事务、消息和回复大多包含很少的字符串和值类型。与IAsyncResult相比,这些类型对性能的影响不会太大,因为IAsyncResult包含一些线程同步互斥体或信号量等,维护和创建更多此类类型的对象会在运行时需要时影响性能在每次事件中处理它们会对CPU和内存造成越来越大的影响。与昂贵的资源相比,重用简单的值类型几乎没有什么区别。