Производительность Knock при использовании Runat = Server для управления HTML

StackOverflow https://stackoverflow.com/questions/1728445

Вопрос

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

Для целей переписывания URL в ASP.NET я хотел бы объявить все изображения и другие ресурсы в моем приложении с атрибутом Runat = "Server", чтобы воспользоваться синтаксисом пути сервера "~/Images". Отладка на Локахосте особенно сложна, когда используются относительные пути (при использовании переписывания URL). Я знаю, что могу изменить файлы хоста, чтобы несколько преодолеть эту проблему, но это невозможно из -за объема проектов, над которыми мы работаем.

Объявление элементов управления HTML для Runat Server обычно добавляет к ViewState, чтобы обеспечить постоянство данных, но это не будет относиться к изображениям, или я ошибаюсь в отношении этого ...?

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

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

Заранее спасибо.

Это было полезно?

Решение

Предполагая, что вы просите о различиях между:

1) <img runat="server" EnableViewState="false" src="~/images/img.png" />

а также

2) <img src='<%= ResolveUrl ("~/images/img.png") %>' />

Чтобы построить 1), фактический код, сгенерированный (более или менее), является:

System.Web.UI.HtmlControls.HtmlImage __ctrl;
__ctrl = new System.Web.UI.HtmlControls.HtmlImage();
this._bctrl_1 = __ctrl;
__ctrl.EnableViewState = false;
__ctrl.Src = "~/image.png";

Затем этот __CTRL добавляется в дерево управления:

__parser.AddParsedSubObject(this._bctrl_1); // _bctrl_1 is __ctrl from above

Любое событие в жизненном цикле страницы (Init, Load ...) будет распространяться на этот контроль, будет вызван Rendercontrol, чтобы получить HTML из него, ResolveUrl () призван для получения фактического URL и, наконец, Disose () тоже будет называться.

Теперь, в случае 2), контроль не добавляется к своему родителю нормальным способом, но вместо этого вы получаете что -то вроде этого:

__ctrl.SetRenderMethodDelegate(new System.Web.UI.RenderMethod(this.__RenderTree));

Который устанавливает делегат, который будет вызван, когда пришло время отобратьu003Cimg> Анкет В __rendertree часть, которая записывает тег, который нас интересует:

__output.Write("\n<img src='");
__output.Write( ResolveUrl ("~/image.png") );
__output.Write("' />\n");

Так что, да, «много» кода запускается в 1), который не запускается в 2). Теперь, что касается влияния в реальное время исполнения, я думаю, что это не так уж важно. Я протестировал пустую страницу, не имея ничего, кроме тега/управления IMG, и разница между ними в нескольких прогонах была в диапазоне -0,5 мс/+0,5 мс за запрос. Совершенно незначительно.

Другие советы

Есть значительный родственник Над головой даже предполагая, что вы отключили все видовые штаты Marlarky. Тем не менее абсолютный Стоимость, вероятно, непониматна для отдельного пользователя.

Рассмотрим разметку, описывающую серию элементов HTML, она рассматривается как простой буквальный «контроль», который очень эффективно посылает все свое содержимое в ответ в соответствующей точке на странице.

Сравните это со всеми те же элементы, создаваемые как полные элементы управления со всеми созданием объектов, анализом элемента стиля, проверкой и т. Д. Затем Code работает, чтобы принять локальное состояние и в значительной степени отображает ту же наценку HTML, используемую для определения его на странице ASP.NET в первую очередь.

Очевидно, что с точки зрения памяти и процессора с использованием большого количества Runat = "Server" будет дороже. В отдельном случае это, вероятно, не проблема, а для сайта со значительной деятельностью это вполне может быть.

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

Если вы разрабатываете приложение, которое находится на собственном сайте, то в свойствах проекта или сайта измените виртуальный путь в категории веб -сервера разработчика, чтобы быть справедливым "/". Таким образом, когда отладки у вас нет дополнительного / myProjectName / Part в URL. Это позволит вам использовать абсолютный путь к некоторым активам или папке изображений.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top