2009-02-26 4 views
5

Сегодня мне было поручено улучшить производительность классической страницы ASP. Переписывание кода в ASP.NET на данный момент не является вариантом, поэтому я взял вызов, чтобы сжать каждую унцию производительности, которую я могу выйти со страницы.Рекомендации по производительности для классического asp?

Страница состоит из базового слова «SELECT bla bla FROM bla» на пару наборов записей. Цикл while повторяется через эти наборы записей и отвалы <tr> <td> строки. Внутри цикла while есть куча условностей и еще много чего. Существует три подпрограммы, которые используют глобальные переменные (а не локальные переменные, переданные как параметры).

Так что ничего действительно шокирующего и ничего. Прежде чем я начал свою оптимизацию, цикл занял около 15 секунд. Из 15 секунд около 6 были заняты sql-запросом. После того, как я изменил положение вещей, мне удалось развить его до 7 секунд.

Вещи, которые я изменившие вокруг являются:

  • Вместо того чтобы делать SELECT *, я выбрал только те столбцы, которые мне нужны. Запрос снизился в среднем на 4 секунды. Это довольно тяжелый запрос с представлениями в представлениях.

  • Я удалил все контекстные переключения в цикле. Поэтому я изменил такие вещи, как <% = bla%> на Response.Write (bla).

  • 3 подпрограммы были определены как функции, но они использовались как суб (без результата). Поэтому я сменил функции на субтитры. Это помогает?

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

  • Дата функции: DATEADD, DATEDIFF
  • массив функции: UBOUND (обр) и индекс ссылок: аранжировка (I)
  • Строковые функции: слева, в середине, справа, ниже, замените

С каждой страницы вызова, что подпрограмма выполняется около 1600 раз.

У кого-нибудь есть опыт оптимизации оптимизационных страниц asp? У вас есть хорошие советы по оптимизации? То, что я ищу, - это улучшение кода в инструкции do ... loop.

Я опытный разработчик ASP.NET и немного знаю об улучшении производительности в ASP.NET. Классический ASP использует другой «движок», поэтому мне было интересно, есть ли у кого-нибудь какие-либо идеи по улучшению производительности классического ASP.

Спасибо!

M

PS: Да, я знаю, что классический ASP использует VBScript

ответ

3

С каждой страницы вызова, что подпрограмма выполняется около 1600 раз.

Я бы сказал, что это в значительной степени вся проблема, но, не зная подробностей возвращаемых данных запроса, то, что делает это подпрограмма, и почему это должно быть сделано 1600 раз на странице, это трудно предложить много, чтобы опустить его.

+0

Это приложение для планирования, и человек, который его создал, с энтузиазмом создал большой цикл while, который показывает планирование множества записей за целый месяц (30 столбцов и около 20 строк). – mghaoui

0

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

+0

К сожалению, у меня нет кода. Вероятно, у меня проблемы с отправкой. Функция в основном создает строки на основе набора записей, но сплайсирует и конкатенации, а затем сбрасывает ее с помощью response.write. Стандартный материал. – mghaoui

+0

К сожалению, трудно давать советы, когда вы делаете стандартные вещи, и у нас нет доступа к коду. :) Как сказал Чад, возможно, вы можете больше подумать о «почему». Или, может быть, вы можете попытаться переместить кучу операций в хранимую процедуру. –

+0

Интересно, возникает ли это проблема, связанная с конкатенацией. VB известен тем, что не обрабатывает concat 'строк хорошо ... Посмотрите альтернативный метод записи на экран или создания длинных строк (думаю массив или объект потока). –

-2

Я испытал, что в большинстве случаев вы можете получить производительность при использовании StringBuilder в классическом ASP. Существует красивый StringBuilder implementation для классического ASP в пределах ajaxed library. Он использует .net StringBuilder. То довольно прохладный и легкий в использовании:

<% 
set output = new StringBuilder 
do 
    output("some output") 
loop 
response.write(output.toString()) 
%> 

Я бы рекомендовал использовать ajaxed библиотеку, если вам необходимо сделать некоторые настройки. Это настройка быстро и предлагает вам множество инструментов для классического ASP. Например. Возможно, вы также можете получить некоторую производительность при использовании AJAX (или, по крайней мере, впечатления от производительности).

3

Я отмечаю ответ MrChrister как ответ на мой вопрос «Есть ли у вас хорошие советы по оптимизации?». Советы там хорошие, и ему удалось ускорить выполнение скрипта на 2 секунды.

В конце концов я обнаружил, что медленное создание сценария. В цикле while программист много делал Filter (Array). В основном он использовал Filter (Array) для поиска пар ключ/значение.

Итак, окончательное решение изменило код фильтра (Array) на использование объекта «Scripting.Dictionary». Это ускорило код в 12 раз.

Спасибо за все ваши ответы.

M

3

Видя, что это популярный вопрос, который я решил объяснить, что я сделал 3 года назад, что ускорило сценарий ASP.

Оригинальный скрипт сильно использовал масштабируемые массивы для хранения значений ключа, поэтому я модифицировал этот код для использования Scriting.Dictionary. Пример:

Dim myDictionary 
Set myDictionary = Createobject("Scripting.Dictionary") 
myDictionary.item("key") = "value" 

Это намного быстрее, чем масштабируемые массивы.

Другим большим изменением является конкатенация строк. Оригинальный сценарий был полон:

S = "" 
S = S & "First line<br />" 
S = S & "Second line<br />" 
S = S & "Third line line<br />" 
Response.Write(S) 

Я изменил это:

Response.Write("First line<br />") 
Response.Write("Second line<br />") 
Response.Write("Third line<br />") 

Это сделал огромную разницу. Конкатенация строк является огромным узким местом, потому что строка отбрасывается, а затем повторно инициализируется.

Другой вариант:

S = "First line<br />" & _ 
     "Second line<br />" & _ 
     "Third line line<br />" 
Response.Write(S) 

Это также хороший совет для ASP.NET: Используйте StringBuilder вместо конкатенации строк.

Другим важным изменением является переключение контекста. Исходный код был полон:

<table> 
    <tr> 
     <td><%= rs("Col1") %></td> 
     <td><%= rs("Col2") %></td> 
     <td><%= rs("Col2") %></td> 
    </tr> 
</table> 

3 переключений контекста занимают много времени, поэтому я модифицированную к этому:

<% 
Response.Write("<table>") 
Response.Write("<tr>") 
Response.Write("<td>") 
Response.Write(rs("Col1")) 
Response.Write("</td>") 
Response.Write("</tr>") 
Response.Write("<tr>") 
Response.Write("<td>") 
Response.Write(rs("Col2")) 
Response.Write("</td>") 
Response.Write("</tr>") 
Response.Write("<tr>") 
Response.Write("<td>") 
Response.Write(rs("Col3")) 
Response.Write("</td>") 
Response.Write("</tr>") 
Response.Write("</table>") 
%> 

Да код очень избыточными, но работает лучше.

Еще одна небольшая модификация (которая на самом деле грязный хак) является использование WITH (NOLOCK) в запросах SQL:

conn.Query("SELECT * FROM MyTable WITH (NOLOCK) LEFT JOIN AnotherTable WITH (NOLOCK) ON MyTable.Id = AnotherTable.Id") 

Это делает разницу.

Наконец, я не знаю, помогает ли это много, но было много копируемого кода, который я реорганизовал в чистые функции.

Надеюсь, что люди, находившие это, найдут эти советы полезными.

+0

Мой комментарий получил downvoted до 0? В самом деле? Ли человек, который ниспроверг, действительно прочитал нить? – mghaoui

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