#asp-classic #context-switch
#asp-классический #переключение контекста
Вопрос:
Я редактирую некоторый устаревший код в классическом ASP, который использует много кода, подобного следующему:
pf "<div class=""span-6 last"" style=""margin-top:4px;"">"
pf "<div class=""clean-lightblue-left"" style=""margin-top:4px;"">"
pf "<span style=""float: left; margin-right: 0.3em;"" class=""ui-icon ui-icon-print""></span><a href=""#report"" name=""report"" id=""topic_report_download"">Topic Progress : <b>Download Report</b></a>"
pf "</div></div>"
В этом примере pf — это служебная функция, которая по сути такая же, как response.write
и при возврате строки.
Я бы предпочел сделать что-то вроде этого:
...asp code
%>
Regular HTML code here
<%
asp code...
Я новичок в asp, но я слышал о переключении контекста, и что это может быть дорогостоящим. Какой из этих двух вариантов более дорогостоящий?
Комментарии:
1. У меня нет никаких ссылок, но, исходя из моего личного опыта, я заметил, что ваш первый пример будет работать лучше, чем переключение между блоками скриптов ASP и HTML-кодом.
Ответ №1:
Сначала позвольте мне подвести итог вашему конкретному примеру. Серия Response.Write
вызовов, просто передающих простые строковые литералы, будет медленнее, чем включение полного HTML в качестве содержимого вне кода скрипта.
Эта идея «переключения контекста» немного ошибочна из-за какой-то неудачной формулировки в некоторой документации (или, возможно, истории). Мы склонны думать о файле ASP как о HTML с некоторым скриптом, вставленным в него с помощью <% script here %>
. На самом деле файл ASP — это файл сценария с некоторым количеством HTML в нем. Легче рассуждать о том, что происходит, если вы думаете об этом как о разделении содержимого html с помощью %> content here <%
(с подразумеваемым >%
и <%
в начале и в конце файла).
Когда файл анализируется в p-code, создается файл, полностью обрабатываемый скриптовым движком («переключение контекста» отсутствует). По сути %> .... <%
, становится особой формой ответа.Напишите, который отправляет содержимое между %><%
буфером. Разница в том, что байты приходят дословно, как они появляются в исходном ASP-файле, тогда как стандарт Response.Write
принимает строку Unicode из VBScript, а затем должен кодировать Response.CodePage
набор байтов для помещения в буфер.
Следовательно, «переключение контекста» — это просто количество раз, которое скрипт должен записать в буфер. Наличие многих <% = someExpression %>
в вашем HTML создает большое количество записей в буфер.
В наши дни, если вы не генерируете безумно большой объем HTML (статья, о которой упоминает Doozer, 10 лет), у вас была бы включена буферизация. Стоимость многих операций записи довольно низкая. Их сокращение может помочь, но нужно помнить, что способ, которым VBScript обрабатывает связывание строк, также не лишен проблем.
Комментарии:
1. Я задавался вопросом, было ли это просто по сути большим response.write . Это имело бы смысл, поскольку это просто большой блок литералов. Спасибо за объяснение!
Ответ №2:
Я думаю, что плоский HTML хорош, потому что, когда вы отображаете HTML через response.write, он выполняет два оператора, как один, выполняет response.write, а затем отображает HTML. но когда мы пишем HTML-код, он напрямую отображается в браузере.
Ответ №3:
Вам следует прочитать эти советы по ASP для повышения производительности, но особенно обратите внимание на #16
Кроме того, чередование небольших объемов скриптов и HTML приводит к переключению между движком скриптов и HTML, снижая производительность
По крайней мере. Гарантируйте ответ.Для буфера установлено значение true . Разница в производительности между приведенными выше может быть минимальной, но я думаю, что способ, которым вы хотите это изменить, был бы лучше, если я понимаю, как вы хотите это изменить. Однако, в конечном счете, это ваше решение, если вы хотите его изменить. Я бы посмотрел, насколько удобочитаем и удобен в обслуживании код для вас, стоит ли его менять.