mgh*_*oui 5 optimization asp-classic
今天,我的任务是改善传统ASP页面的性能.重写ASP.NET中的代码目前不是一个选项,所以我接受了挑战,以挤出我可以从页面中获得的每一盎司性能.
该页面包含基本的"SELECT bla bla FROM bla"到几个记录集中.while循环遍历这些记录集并转储<tr> <td>字符串.在while循环中有一堆条件和诸如此类的东西.有3个子程序被调用,它们使用全局变量(不是作为参数传递的局部变量).
所以没有什么真正令人震惊或什么.在我开始优化之前,循环大约需要15秒才能完成.在sql查询占用了大约6秒的15秒.
在改变了一些事情之后,我设法将其提高了大约7秒.
我改变的是:
我没有选择SELECT*,只选择了我需要的列.查询平均下降到4秒.这是一个非常繁重的查询,其中包含视图中的视图.
我删除了循环中的所有上下文切换.所以我把像<%= bla%>这样的东西改成了Response.Write(bla).
3个子程序被定义为函数,但它们被用作子(没有结果).所以我把功能改成了潜艇.这有帮助吗?
在做出我的更改之后,我发现大部分时间都是由其中一个子程序占用的.我今天没有足够的时间来改变子程序,但它包括以下内容:
每次调用页面时,该子程序运行1600次左右.
有没有人有优化经典asp页面的经验?你有什么好的优化技巧吗?我正在寻找的是在do ...循环语句中改进代码.
我是一位经验丰富的ASP.NET开发人员,对ASP.NET中的性能改进有很多了解.经典ASP使用不同的"引擎",所以我想知道是否有任何人对提高经典ASP的性能有任何见解.
谢谢!
中号
PS:是的,我知道经典的ASP使用VBScript
看到这是一个受欢迎的问题,我决定解释我 3 年前所做的加速 ASP 脚本的操作。
原始脚本大量使用可调整大小的数组来存储键值,因此我修改了该代码以使用 Scriting.Dictionary。例子:
Dim myDictionary
Set myDictionary = Createobject("Scripting.Dictionary")
myDictionary.item("key") = "value"
Run Code Online (Sandbox Code Playgroud)
这比可调整大小的数组快得多。
另一个重大变化是字符串的串联。原始脚本充满了:
S = ""
S = S & "First line<br />"
S = S & "Second line<br />"
S = S & "Third line line<br />"
Response.Write(S)
Run Code Online (Sandbox Code Playgroud)
我将其修改为:
Response.Write("First line<br />")
Response.Write("Second line<br />")
Response.Write("Third line<br />")
Run Code Online (Sandbox Code Playgroud)
这产生了巨大的差异。字符串的连接是一个巨大的瓶颈,因为字符串被丢弃然后重新初始化。
另一种选择是:
S = "First line<br />" & _
"Second line<br />" & _
"Third line line<br />"
Response.Write(S)
Run Code Online (Sandbox Code Playgroud)
这也是 ASP.NET 的一个很好的提示:使用 StringBuilder 而不是连接字符串。
另一个重要的变化是上下文切换。原来的代码充满了:
<table>
<tr>
<td><%= rs("Col1") %></td>
<td><%= rs("Col2") %></td>
<td><%= rs("Col2") %></td>
</tr>
</table>
Run Code Online (Sandbox Code Playgroud)
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>")
%>
Run Code Online (Sandbox Code Playgroud)
是的,代码非常冗余,但性能更好。
另一个小的修改(实际上是一个肮脏的黑客)是在您的 SQL 查询中使用 WITH (NOLOCK):
conn.Query("SELECT * FROM MyTable WITH (NOLOCK) LEFT JOIN AnotherTable WITH (NOLOCK) ON MyTable.Id = AnotherTable.Id")
Run Code Online (Sandbox Code Playgroud)
它有所作为。
最后,我不知道这是否有很大帮助,但是我将很多复制粘贴的代码重构为干净的函数。
我希望发现这个主题的人会发现这些技巧很有用。