首页 文章

经典asp的性能提示?

提问于
浏览
5

今天,我的任务是改善传统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

6 回答

  • 0

    GetRows这将创造您寻求的速度 . 这是我用过的some other tips .

  • -2

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

    我几乎都是整个问题,但是如果不知道返回查询的数据的细节,该子程序做了什么,以及为什么需要为一个页面完成1600次,那么很难建议降低它 .

  • 9

    我将MrChrister的答案标记为我的问题的答案“你有什么优化技巧吗?” . 那里的提示很好,它设法加快脚本2秒 .

    我最终发现是什么让脚本变慢了 . 在while循环中,程序员正在做很多Filter(Array) . 他基本上使用Filter(Array)来查找键/值对 .

    因此,最终的解决方案是将Filter(Array)的代码更改为使用“Scripting.Dictionary”对象 . 它将代码加速了12倍 .

    感谢你的回复 .

    中号

  • 3

    看到这是一个流行的问题,我决定解释我3年前做的事情,加快了ASP脚本的速度 .

    原始脚本大量使用可调整大小的数组来存储键值,因此我修改了该代码以使用Scriting.Dictionary . 例:

    Dim myDictionary
    Set myDictionary = Createobject("Scripting.Dictionary") 
    myDictionary.item("key") = "value"
    

    这比可调整大小的数组快得多 .

    另一个重大变化是字符串的连接 . 原始剧本充满了:

    S = ""
    S = S & "First line
    " S = S & "Second line
    " S = S & "Third line line
    " Response.Write(S)

    我将其修改为:

    Response.Write("First line
    ") Response.Write("Second line
    ") Response.Write("Third line
    ")

    这产生了巨大的变化 . 字符串的串联是一个巨大的瓶颈,因为字符串被丢弃然后重新初始化 .

    另一种选择是:

    S = "First line
    " & _ "Second line
    " & _ "Third line line
    " 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>")
    %>
    

    是的,代码非常冗余,但性能更好 .

    另一个小修改(实际上是一个肮脏的黑客)是在SQL查询中使用WITH(NOLOCK):

    conn.Query("SELECT * FROM MyTable WITH (NOLOCK) LEFT JOIN AnotherTable WITH (NOLOCK) ON MyTable.Id = AnotherTable.Id")
    

    它有所作为 .

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

    我希望找到这个thead的人会找到这些提示有用 .

  • 3

    如果您真的认为问题出在1函数中,为什么不将代码放在这里,以便人们可以提出优化建议 .

  • 3

    我经历过,在大多数情况下,您可以在经典ASP中使用StringBuilder时获得性能 . ajaxed library中的经典ASP有一个很好的StringBuilder implementation . 它使用.net StringBuilder . 这很酷,易于使用:

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

    如果你需要做一些调整,我建议使用ajaxed库 . 它设置很快,为您提供了很多经典ASP的工具 . 例如 . 也许你在使用AJAX时可以获得一些性能(或者至少是性能的印象) .

相关问题