Медленное вложенное время рендеринга частичного ответа - PullRequest
3 голосов
/ 12 сентября 2010

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

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

Сначала я подумал, что SQL-сущность замедляет работу из-за сложности модели представления, но, по моим журналам, она создает модель менее чем за 1 секунду.

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

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

Edit:

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

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

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

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

1 Ответ

2 голосов
/ 14 сентября 2010

Проблема решена

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

Мастер производительности 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

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

...