2013-11-12 4 views
8

У меня есть простой веб-интерфейс API, который возвращает список контактов:ASP.NET проблема производительности Web API

public class ContactsApi : ApiController 
{ 
    public List<Contact> GetContacts() 
    { 
     Stopwatch watch = new Stopwatch(); 
     watch.Start(); 
     // Doing some business to get contacts; 
     watch.Stop(); 
     // The operation only takes less than 500 milliseconds 
     // returning list of contacts 
    } 
} 

Как я использовал Stopwatch для проверки данных-поисковой работы, это очевидно, что она занимает меньше Второй. Однако, когда я делаю запрос на действие GetContacts через браузер Chrome, для возврата данных требуется от 4 до 5 секунд.

enter image description here

Видимо, что задержка не имеет ничего общего с моим кодом данных поиска. Мне кажется, что веб-API работает медленно. Но я не знаю, как отлаживать и отслеживать это.

Есть ли какая-либо утилита для регистрации времени для конвейера процесса HTTP-запроса ASP.NET? Я имею в виду, что-то вроде Navigation Timing, чтобы показать, что каждое событие произошло в какое время?

+1

Вы пробовали [fiddler] (http://fiddler2.com/)? – amrswalha

+2

Думаю, вам нужно сузить место, где оно замедляется. Это может быть ASP.NET, это может быть IIS, это может быть на сетевом уровне. Вы пытались подключить отладчик и поставить точку останова в первой строке функции? Если нет, сделайте это и посмотрите, называется ли это через 4,5 секунды или сразу. 4,5 секунды - это долгое время, звучит сетевая связь со мной. – Rocklan

+1

@amrswalha, скрипач здесь не поможет. Проблема на сервере. OP говорит о ASP.NET HTTP Process Pipeline. –

ответ

0

Попробуйте использовать Fiddler (http://fiddler2.com/), бесплатный инструмент для веб-отладки. Он имеет большинство функций, которые вы ищете.

+2

Это не то, что можно сделать со скрипачом! как сказал Саид Неамати по более раннему ответу –

5

Насколько велика ваша реакция? Может быть, это стоимость сериализации и передачи? Тем не менее, есть много возможностей для его профилирования, я бы начал с профилирования одним из инструментов на рынке, например ANTS Performance Profiler или dotTrace

2

Запускаете ли вы его с помощью отладчика? Проведите несколько тестов без отладчика. У меня были аналогичные проблемы с проектом веб-API, который я сейчас разрабатываю, и для нас Отключение отладчика заставляло тест принимать миллисекунды вместо секунд.

. При первом запуске API, как и в случае с API, также возникает некоторая стоимость запуска, а последующий запрос всегда быстрее.

+0

, мы также запускали тесты без отладчика!даже после кэширования загруженного файла требуется около 4-5 секунд для извлечения данных с сервера, это может быть причиной сети, еще не уверен! –

0

4,5 секунды довольно огромные. Если вы используете EF, вы можете использовать MiniProfiler.EF

Я испытал некоторое замедление (в прошлом), неправильно используя Entity Framework Queryable (преобразование его в списки, расширение, ...).

Если вы используете EF, сохраните его IQueryable как можно дольше (.ToList() выполняет запрос).

В соответствии с вашими потребностями используйте инструменты отладки, такие как MiniProfiler, MiniProfiler.Ef и другие предлагаемые инструменты, вероятно, тоже хороши (хотя я не использовал их раньше).

Стоимость сериализации может быть важной (если OU использует DTO), AutoMapper (и, возможно, другие инструменты) кажется медленным в больших списках. Я бы предложил вручную сопоставить их в методе расширения, если вам действительно нужна производительность в больших списках.

Смежные вопросы