Классический asp — лучше делать много ответов. писать или использовать <%

#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 . Разница в производительности между приведенными выше может быть минимальной, но я думаю, что способ, которым вы хотите это изменить, был бы лучше, если я понимаю, как вы хотите это изменить. Однако, в конечном счете, это ваше решение, если вы хотите его изменить. Я бы посмотрел, насколько удобочитаем и удобен в обслуживании код для вас, стоит ли его менять.