2013-04-15 2 views
2

Я использую Entity Framework 6.0.0 alpha1.Asp.net MVC async is slow

В моем приложении Asp.net MVC, у меня есть два контроллера:

Один без асинхронном:

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) 

Моего вопрос, почему асинхронного медленно?

+0

не должна ли вторая реализация возвращать задачу, а не представление? – Yaur

+0

Потому что это контроллер, возвращающий результат для просмотра. – Alvin

ответ

6

Вы тестируете, как скоро вызов async вернется, чтобы вы могли выполнить другую работу, или же вы ждете завершения работы? Async не волшебным образом заставляет работу работать быстрее; он просто блокирует ваши вызовы методов, чтобы вы могли делать что-то еще, пока работа завершается.

Фактически, если вы ожидаете, что работа будет выполнена, асинхронный переход займет немного больше времени, потому что он добавляет некоторые накладные расходы.

То, что вы действительно должны измерять, - это масштабируемость, а не скорость. Синхронный веб-сайт будет быстрее обслуживать первые несколько вызовов, но замедляться при добавлении дополнительной нагрузки. Хорошо написанный асинхронный веб-сайт должен обрабатывать большее количество вызовов более последовательно и надежно, потому что вы более эффективно используете процессорные ядра.

Чтобы улучшить общую масштабируемость и отзывчивость, найдите длительные операции, которые вам или пользователю не нужно ждать до завершения, и сделайте их асинхронными.

+0

Спасибо, но как измерить масштабируемость? – Alvin

+0

http://stackoverflow.com/questions/299518/asp-net-stress-testing –

+0

Асинхронные методы полезны, когда у вас есть несколько задач, которые не зависят от eachother. В противном случае нет смысла добавлять сложность, чтобы сделать их асинхронными. Еще одна потенциальная победа заключается в том, что вы зависите от внешних сервисов, которые могут не возвращаться сразу - долговременного запроса или веб-службы - _ и есть что-то еще полезное, что ваш код может делать, пока вы ждете. В противном случае просто держите его простым. Ваш асинхронный вызов выполняется по потоку из того же пула потоков, который сам использует сам ASP.NET, поэтому вы автоматически не освобождаете какие-либо ресурсы ASP.NET, перейдя также в async. – Craig