Видя, что это популярный вопрос, я решил объяснить, что я сделал 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")
Это имеет значение.
Наконец, я не знаю, сильно ли это помогает, но было много скопированного кода, который я преобразовал в чистые функции.
Я надеюсь, что люди, которые найдут эту теаду, найдут эти советы полезными.