经典asp的性能提示?

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个子程序被定义为函数,但它们被用作子(没有结果).所以我把功能改成了潜艇.这有帮助吗?

在做出我的更改之后,我发现大部分时间都是由其中一个子程序占用的.我今天没有足够的时间来改变子程序,但它包括以下内容:

  • 日期功能:Dateadd,Datediff
  • 数组函数:Ubound(arr)和索引引用:arr(I)
  • 字符串函数:左,中,右,下,替换

每次调用页面时,该子程序运行1600次左右.

有没有人有优化经典asp页面的经验?你有什么好的优化技巧吗?我正在寻找的是在do ...循环语句中改进代码.

我是一位经验丰富的ASP.NET开发人员,对ASP.NET中的性能改进有很多了解.经典ASP使用不同的"引擎",所以我想知道是否有任何人对提高经典ASP的性能有任何见解.

谢谢!

中号

PS:是的,我知道经典的ASP使用VBScript

MrC*_*ter 9

GetRows 这将创造您寻求的速度.以下是我使用过的其他一些提示.


mgh*_*oui 5

看到这是一个受欢迎的问题,我决定解释我 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)

它有所作为。

最后,我不知道这是否有很大帮助,但是我将很多复制粘贴的代码重构为干净的函数。

我希望发现这个主题的人会发现这些技巧很有用。