Советы по производительности для классического Asp? - PullRequest
5 голосов
/ 26 февраля 2009

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

Страница состоит из базового «SELECT bla bla FROM bla» в пару наборов записей. Цикл while перебирает эти наборы записей и выводит строки

. В цикле while есть куча условностей и еще много чего. Вызывается 3 подпрограммы, которые используют глобальные переменные (а не локальные переменные, передаваемые в качестве параметров).

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

После изменения нескольких вещей мне удалось добиться примерно 7 секунд.

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

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

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

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

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

  • Функции даты: Dateadd, Datediff
  • Функции массива: Ubound (arr) и ссылки на индексы: arr (I)
  • Строковые функции: левый, средний, правый, нижний, заменить

При каждом вызове страницы эта подпрограмма выполняется около 1600 раз.

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

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

Спасибо!

M

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

Ответы [ 6 ]

9 голосов
/ 26 февраля 2009

GetRows Это создаст скорость, которую вы ищете. Вот некоторые другие советы Я использовал.

4 голосов
/ 11 мая 2012

Видя, что это популярный вопрос, я решил объяснить, что я сделал 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")

Это имеет значение.

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

Я надеюсь, что люди, которые найдут эту теаду, найдут эти советы полезными.

3 голосов
/ 04 марта 2009

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

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

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

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

M

3 голосов
/ 26 февраля 2009

При каждом вызове страницы эта подпрограмма выполняется около 1600 раз.

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

0 голосов
/ 27 февраля 2009

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

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

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

0 голосов
/ 26 февраля 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...