有问题的MVC控制器上的Async vs Sync基准测试
我已经设置了这篇MSDN文章在ASP.NET MVC 4中使用异步方法的示例,并做了一些基准测试以了解我的想法。
服务器配置:
- Windows 7专业版(x64)
- IIS 7.5
- 英特尔酷睿i7-2600S @ 2.80HGz
- 8GB内存
- AppPool>最大工作进程:10
我设置了2个控制器Sync
和Async
,并使用加载器工具进行基准测试。 加载器工具只发送50-60个常量请求一分钟。 每个控制器调用相同的Web服务3次。 每个代码如下:
同步:
public ActionResult Sync() { var g1 = GetGizmos("url1"); var g2 = GetGizmos("url2"); var g3 = GetGizmos("url3"); return Content(""); } public object GetGizmos(string uri) { using (WebClient webClient = new WebClient()) { return JsonConvert.DeserializeObject( webClient.DownloadString(uri) ); } }
异步:
public async Task Async() { var g1 = GetGizmosAsync("url1"); var g2 = GetGizmosAsync("url2"); var g3 = GetGizmosAsync("url3"); var a1 = await g1; var a2 = await g2; var a3 = await g3; return Content(""); } public async Task GetGizmosAsync(string uri) { using (HttpClient httpClient = new HttpClient()) { var response = await httpClient.GetAsync(uri); return (await response.Content.ReadAsAsync()); } }
第一个问题,有没有人知道为什么Async需要更长时间,运行更少并导致超时,而同步版本不是? 我认为使用Async会更快,没有超时等等。只是看起来不对,我在这里做错了吗? 可以做些什么来改善/修复它?
第二个问题,一般来说,使用WebRequests有没有办法加快速度? 我在global.asax
设置了以下内容,但仍不确定用法是否正确:
System.Net.ServicePointManager.DefaultConnectionLimit = 1000;
此外,任何其他建议,以帮助加快执行这些类型的品尝的应用程序将是非常有帮助的。
我认为线索是你的比较
webClient.DownloadString(uri)
至
var response = await httpClient.GetAsync(uri); return (await response.Content.ReadAsAsync
也许你可以试试
webclient.DownloadStringAsync(uri)
并且您可以优化您的异步代码
await Task.Run(() => { // just run your sync code here var g1 = GetGizmos("url1"); var g2 = GetGizmos("url2"); var g3 = GetGizmos("url3"); return Content(""); });
这里有一个异步屈服点就足够了。
有关异步的详细信息,请参阅此答案: 您是否必须将Task.Run放入一个方法以使其异步?