2015-04-21 4 views
5

Наше веб-приложение содержит десятки частичных представлений, некоторые из которых являются дочерними. Мы заметили, что приложение наступает медленно при первом загрузке, для инициализации каждого вида, которое он вызывает в первый раз, требуется от 0,5 до 1 секунды. Я проследил сроки и обнаружил, что это:Html.RenderPartial slow

Html.RenderPartial("~/Full/Relative/Path/To/View.cshtml", null); 

может занять около 1 секунды, даже если вид абсолютно пуст. В то же время это:

var view = ViewEngines.Engines.FindPartialView(
ViewContext.Controller.ControllerContext, "~/Full/Relative/Path/To/View.cshtml"); 

занимает 1 миллисекунду, поэтому времени на поиск файла не тратится.
Вопросы:
1. Разве это нормально, когда компилятор представления занимает так много времени?
2. Есть ли другой способ быстро сделать первый вызов, но не имеет представления, предварительно скомпилированного с директивой в csproj?

ps: странно, что одни и те же представления загружались быстрее в начале разработки приложения.

+0

Возможно, это поможет http://codeclimber.net.nz/archive/2009/04/22/how-to-improve-htmlhelper.renderpartial-performances-donrsquot-run-in-debug-mode.aspx –

+0

@ DZL спасибо, я знаю, что это только ускоряет дальнейшие звонки, а не начальные. – LINQ2Vodka

+0

Upvoted (если только для вашего довольно крутого выбора имени пользователя) :) –

ответ

7

Задержка, которую вы видите, сводится к первоначальной компиляции вида при первом использовании. Скорость будет ниже сервера (процессор и скорость привода, память, использование и т. Д.).

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

+0

Спасибо, проголосовали. Может быть, вы знаете, почему она загружалась быстрее в начале? – LINQ2Vodka

+0

@ LINQ2Vodka: Предположительно, ваш проект был меньше? Он должен сначала найти/проверить и, возможно, скомпилировать все зависимости кода, а не только представление. Не так много отличается от построения решения (просто не все). –

+0

добавлена ​​некоторая информация в новом комментарии, может быть полезна – LINQ2Vodka

0

Ну, ответ TrueBlueAussie правильный, но у меня есть что добавить.
При компиляции представлений (во время компиляции приложения или позже, в зависимости от конфигурации проекта) компилятор создает * .dll, по одному на каждую папку, содержащую представления. Когда приложение собирается отобразить представление в первый раз, вся DLL, содержащая это представление, загружается сервером IIS. Вы можете легко обнаружить, что он смотрит окно вывода в VS во время этого процесса, и это может занять секунду или даже больше. После загрузки DLL все остальные виды, находящиеся в одной и той же папке, отображаются быстро. Таким образом, чем больше папок в представлениях, тем чаще вы загружаете их IIS и тратите время. Надеюсь это поможет.

1

Я также добавить, что:

Html.RenderPartial("~/Full/Relative/Path/To/View.cshtml", null); 

фактически Рендеринг HTML в поток. Где, как:

var view = ViewEngines.Engines.FindPartialView(
    ViewContext.Controller.ControllerContext, "~/Full/Relative/Path/To/View.cshtml"); 

только возвращая IView, он не выполняет вид.

+0

это хорошая уловка – LINQ2Vodka

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