Optimization 经典asp的性能提示?

Optimization 经典asp的性能提示?,optimization,asp-classic,Optimization,Asp Classic,今天我的任务是改进一个经典ASP页面的性能。在ASP.NET中重写代码目前还不是一个选项,所以我接受了挑战,从页面中获得了每一盎司的性能 该页面由基本的“从bla中选择bla bla”组成,包含几个记录集。while循环遍历这些记录集并转储字符串。在while循环中有一堆条件语句等等。调用的3个子例程使用全局变量(不是作为参数传递的局部变量) 所以没有什么真正令人震惊的事情。在我开始优化之前,循环大约需要15秒才能完成。sql查询占用了大约6秒的15秒钟 在改变了一些东西之后,我设法把它调整到7

今天我的任务是改进一个经典ASP页面的性能。在ASP.NET中重写代码目前还不是一个选项,所以我接受了挑战,从页面中获得了每一盎司的性能

该页面由基本的“从bla中选择bla bla”组成,包含几个记录集。while循环遍历这些记录集并转储字符串。在while循环中有一堆条件语句等等。调用的3个子例程使用全局变量(不是作为参数传递的局部变量)

所以没有什么真正令人震惊的事情。在我开始优化之前,循环大约需要15秒才能完成。sql查询占用了大约6秒的15秒钟

在改变了一些东西之后,我设法把它调整到7秒左右

我改变的是:

  • 我没有选择*,而是只选择了需要的列。查询时间平均下降到4秒。这是一个相当繁重的查询,视图中包含视图

  • 我删除了循环中的所有上下文切换。所以我改变了一些事情,比如回复。写作(bla)

  • 这3个子例程被定义为函数,但它们被用作子例程(没有结果)。所以我把函数改成了subs。这有用吗

在进行更改之后,我发现大部分时间都被一个子程序占用了。我今天没有足够的时间来更改子程序,但它由以下内容组成:

  • 日期函数:Dateadd、Datediff
  • 数组函数:Ubound(arr)和索引引用:arr(I)
  • 字符串函数:左、中、右、下、替换
对于每个页面调用,该子例程大约运行1600次

有没有人有过优化经典asp页面的经验?你有什么好的优化建议吗?我所寻找的是改进代码在一个做。。。循环语句

我是一名经验丰富的ASP.NET开发人员,对ASP.NET的性能改进非常了解。Classic ASP使用不同的“引擎”,因此我想知道是否有人对改进Classic ASP的性能有任何见解

谢谢

M

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

对于每个页面调用,该子例程大约运行1600次


我想说这几乎就是问题的全部,但是如果不知道查询返回的数据的细节,子例程的作用,以及为什么需要对一个页面执行1600次,很难建议降低它。

如果你真的认为问题出在那1个函数中,你为什么不把代码放在这里,这样人们就可以提出优化建议。

这将创造你所追求的速度。这里是我使用过的。

我体验到,在大多数情况下,在经典ASP中使用StringBuilder可以获得性能。在中有一个很好的经典ASP。它使用.net StringBuilder。这非常酷且易于使用:

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


如果您需要进行一些调整,我建议您使用ajaxed库。它的安装速度很快,并为您提供了许多经典ASP。例如,在使用AJAX时,也许您还可以获得一些性能(或者至少是性能的印象)

我把克里斯特先生的回答作为我问题“你有什么好的优化建议吗?”。这里的提示很好,它设法将脚本速度提高了2秒

我终于发现了是什么让剧本变慢了。在while循环中,程序员经常进行过滤(数组)。他基本上是使用过滤器(数组)来查找键/值对

因此,最终的解决方案是将过滤器(数组)的代码更改为使用“Scripting.Dictionary”对象。它将代码速度提高了12倍

谢谢你的回复


看到这是一个很受欢迎的问题,我决定解释一下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)
<table>
    <tr>
        <td><%= rs("Col1") %></td>
        <td><%= rs("Col2") %></td>
        <td><%= rs("Col2") %></td>
    </tr>
</table>
这很重要

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


我希望找到这个thead的人会发现这些提示很有用。

它适用于一个规划应用程序,并且它的构建者热情地创建了一个大的while循环,它显示了整个月内许多记录的规划(30列,大约20行)。不幸的是,我没有代码。我可能会因为张贴它而遇到麻烦。该函数基本上基于记录集构建字符串,但会进行拼接和合并,然后使用response.write将其转储。标准的东西。不幸的是,当你在做标准的东西时,很难给出建议,我们无法访问代码。:)就像查德说的,也许你可以多想想“为什么”。或者您可以尝试将一组操作移动到存储过程中。我想知道是不是连接导致了这个问题。VB因不能很好地处理字符串的concat而闻名。。。研究另一种写入屏幕或创建长字符串的方法(想想数组或流对象)。我的评论被否决为0?真正地投反对票的人真的读过这条线索吗?
S = "First line<br />" & _
        "Second line<br />" & _
        "Third line line<br />" 
Response.Write(S)
<table>
    <tr>
        <td><%= rs("Col1") %></td>
        <td><%= rs("Col2") %></td>
        <td><%= rs("Col2") %></td>
    </tr>
</table>
<%
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>")
%>
conn.Query("SELECT * FROM MyTable WITH (NOLOCK) LEFT JOIN AnotherTable WITH (NOLOCK) ON MyTable.Id = AnotherTable.Id")