Медленное вложенное время рендеринга частичного ответа

У меня есть представление asp.net / страница (динамическая), которая состоит из вложенных Html.RenderPartials. Представление отправляется соответствующей модели представления для визуализации.

Firebug говорит, что GET-ответ для HTML составляет 9,89 с для 9,5 КБ. Для сравнения страница часто задаваемых вопросов (статический HTML) того же сайта составляет 1,3 секунды для 17K.

Сначала я думал, что это SQL Entity замедляет работу из-за сложности viewmodel, но, по моим логам, кажется, что viewmodel создается менее чем за 1 секунду.

Любые идеи, почему представление MVC занимает так много времени, и как я могу ускорить это? Я рассматриваю частичную загрузку через ajax.

(Кстати, я Gzip и использую CDN и т. д. - я закопал весь сайт до смерти)

Редактировать:

Добавлены таймеры (секундомер) для OnActionExecuting/OnActionExecuted и OnResultExecuting/OnResultExecuted.

12.09.2010 18:39:20: Контроллер: Действие профиля: Индекс Истекшее время: 680.6431 - Действие

12.09.2010 18:39:29: Контроллер: Действие профиля: Индекс Истекшее время: 9202.063 - Результат

9 секунд для рамок для визуализации представления.

1 ответ

Решение

Задача решена

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

Мастер производительности VS2010 говорил, что каждый объект, передаваемый в PartialViews, занимал огромное процессорное время, и я предположил, что он является частичным, поскольку я прочитал, что они могут иметь проблемы.

foreach (ProfileComment item in Model)
{
    Html.RenderPartial("UserActivityComment", item);
}
...
Friends friend = Model.Friends.Where(e => e.ID == activity.ActionID).FirstOrDefault();
if (friend.FriendsProfile.UserName != Page.User.Identity.Name)
{
    Html.RenderPartial("UserActivityFriend.ascx", friend);
}

Объект ProfileComment и Friends (плюс другие) являются частью ViewModel, которую я генерирую и передаю на страницу. Теперь виртуальная машина генерируется через Entity Framework менее чем за 0,3 секунды, поэтому я предположил, что с виртуальной машиной все в порядке.

Огромная задержка наступила, когда я захотел, чтобы представление обработало его. Модель в цикле for была помечена, как и FirstOrDefault с помощью мастера Performace.

Хм странно, модель строится быстро, но не обрабатывается быстро. Решение:

_entities.Friends.MergeOption = MergeOption.NoTracking;
_entities.ProfileComment.MergeOption = MergeOption.NoTracking;

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

Больше информации на Aia Research

и blogs.microsoft.co.il/blogs/gilf/archive/2009/02/20/disabling-change-tracking-in-entity-framework.aspx

Пожалуйста, не стесняйтесь подробно остановиться на этом. Кстати, увеличение производительности было огромным!

Другие вопросы по тегам