Backgound:我必须调用Web服务调用1500次,这需要大约1.3秒的时间才能完成。 (无法控制此第三方API。)总计时间= 1500 * 1.3 = 1950秒/ 60秒=大致32分钟。提高异步Web调用的性能
我想出了我虽然是一个很好的解决方案,但它没有泛出那么好。 因此,我改变了异步Web调用的电话,认为这会显着帮助我的结果它没有。
示例代码:
预优化:
foreach (var elmKeyDataElementNamed in findResponse.Keys)
{
var getRequest = new ElementMasterGetRequest
{
Key = new elmFullKey
{
CmpCode = CodaServiceSettings.CompanyCode,
Code = elmKeyDataElementNamed.Code,
Level = filterLevel
}
};
ElementMasterGetResponse getResponse;
_elementMasterServiceClient.Get(new MasterOptions(), getRequest, out getResponse);
elementList.Add(new CodaElement { Element = getResponse.Element, SearchCode = filterCode });
}
随着优化:
var tasks = findResponse.Keys.Select(elmKeyDataElementNamed => new ElementMasterGetRequest
{
Key = new elmFullKey
{
CmpCode = CodaServiceSettings.CompanyCode,
Code = elmKeyDataElementNamed.Code,
Level = filterLevel
}
}).Select(getRequest => _elementMasterServiceClient.GetAsync(new MasterOptions(), getRequest)).ToList();
Task.WaitAll(tasks.ToArray());
elementList.AddRange(tasks.Select(p => new CodaElement
{
Element = p.Result.GetResponse.Element,
SearchCode = filterCode
}));
较小的采样实例: 所以能够轻松测试我做了60笔较小的取样本花了60秒没有优化,优化只花了50秒。我想尽管它已经接近30或更好。
我用wireshark来观察交易过程,并意识到异步方式没有像我认为的那样快速发送。
异步请求捕获
普通无优化 你可以看到asnyc推几个非常快,然后脱落...... 另外请注意,要求10和11之间花了将近3秒。
创建线程的开销是否会减慢需要秒数的任务? 注:我所指的任务是4.5 TAP任务库。
为什么请求会比这更快。 我被告知我打的Apache Web服务器可以容纳200个最大线程,所以我没有看到一个问题。
我是不是在想这个很清楚? 在调用Web服务时,异步请求有没有什么优势? 我有代码错误吗? 任何想法都会很棒。
出的1.3秒钟,这两点需要执行一个电话,其实是如何的那个时候花了多少钱在服务器上执行的工作?如果服务器需要1.2秒来执行工作并且存在资源限制,则异步可能没有什么区别。 – Pete 2013-04-05 18:42:33
了解服务器可能总是需要1.3秒,但如果请求同时运行,那么它应该消耗更多的时间正确吗? – retslig 2013-04-05 18:52:37
这取决于资源的限制。有些事情不会从并发中受益,有些事情甚至会受到它的伤害。这取决于什么导致服务器花费1.3秒。它可能不会从并发中受益。 – Pete 2013-04-05 19:17:53