Asp.net MVC异步操作速度慢

3
我是一个有用的助手,可以为你翻译文本。

我正在使用Entity Framework 6.0.0 alpha1。

在我的Asp.net MVC应用程序中,我有两个控制器:

其中一个没有使用async:

    public ActionResult Index()
    {
        return View(db.Movie.ToList());
    }

一个是使用异步:

    public async Task<ActionResult> Index()
    {
        var model = await db.Movie.ToListAsync();
        return View(model);
    }

我使用ab工具来测试性能:

没有异步的结果:

Server Software:        Microsoft-IIS/8.0
Server Hostname:        localhost
Server Port:            60863

Document Path:          /movies
Document Length:        5724 bytes

Concurrency Level:      10
Time taken for tests:   21.229 seconds
Complete requests:      1000
Failed requests:        0
Write errors:           0
Total transferred:      6071000 bytes
HTML transferred:       5724000 bytes
Requests per second:    47.11 [#/sec] (mean)
Time per request:       212.290 [ms] (mean)
Time per request:       21.229 [ms] (mean, across all concurrent requests)
Transfer rate:          279.27 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.5      0       4
Processing:    66  211  71.3    195     806
Waiting:       66  211  71.3    195     806
Total:         67  211  71.3    196     807

Percentage of the requests served within a certain time (ms)
  50%    196
  66%    223
  75%    245
  80%    260
  90%    298
  95%    334
  98%    397
  99%    461
 100%    807 (longest request)

异步操作的结果:

Concurrency Level:      10
Time taken for tests:   29.495 seconds
Complete requests:      1000
Failed requests:        0
Write errors:           0
Total transferred:      6071000 bytes
HTML transferred:       5724000 bytes
Requests per second:    33.90 [#/sec] (mean)
Time per request:       294.947 [ms] (mean)
Time per request:       29.495 [ms] (mean, across all concurrent requests)
Transfer rate:          201.01 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.5      0       2
Processing:    69  293 160.0    244    1546
Waiting:       69  293 160.0    244    1546
Total:         70  294 160.0    245    1547

Percentage of the requests served within a certain time (ms)
  50%    245
  66%    295
  75%    343
  80%    373
  90%    507
  95%    639
  98%    772
  99%    841
 100%   1547 (longest request)

我的问题是为什么异步操作很慢?


第二个实现不应该返回一个视图而是一个任务吗? - Yaur
因为这是一个控制器将结果返回给视图。 - Alvin
1个回答

7
你是在测试异步调用的响应时间以便在工作完成前可以做其他事情,还是在等待工作完成?异步并不会让工作更快地完成;它只是解除了方法调用的阻塞,使您可以在工作进行时做其他事情。
实际上,如果你正在等待工作完成,异步会花费更长的时间,因为它增加了一些开销。
你真正应该衡量的是可扩展性而不是速度。同步网站将更快地服务于前几个调用,但随着负载的增加,速度会变慢。编写良好的异步网站应该更加一致和可靠地处理更多的调用,因为你更有效地使用了处理器核心。
为了提高整体可扩展性和响应能力,请寻找你或用户不必等待完成的长时间运行的操作,并使其异步化。

谢谢,但我如何衡量可扩展性? - Alvin
异步方法在您有多个不相互依赖的任务时非常有用。否则,增加复杂性使它们异步化没有任何意义。另一个潜在的优势是当您依赖于可能无法立即返回的外部服务——例如长时间运行的数据库查询或Web服务——而且在等待期间您的代码可以做其他有意义的事情。否则,保持简单。您的异步调用在与ASP.NET本身使用的线程池中的线程上运行,因此通过进行异步操作并不会自动释放任何ASP.NET资源。 - Craig Tullis
1
@Craig:我应该补充说明,除非有很多用户(对于某个任意值的“很多”),否则不需要广泛使用异步。 - Robert Harvey
我没有空间了...(同意) :-) - Craig Tullis
1
我想我还要补充一点,就是从一般意义上讲,“速度”和“可扩展性”是根本不同的东西。这可能过于简化了,但也许可以这样想: “速度”意味着一个页面将在500毫秒内返回。可扩展性意味着一个在1000毫秒内返回的页面,在有200个并发用户(或等于“许多任意值”的用户数量)时仍将在不到1000毫秒的时间内返回。一个应用程序快并不意味着它能够扩展,而一个能够扩展的应用程序也不一定是在为少数用户提供少量页面时最快的。 - Craig Tullis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接