今天,我的任务是改善传统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 回答
GetRows这将创造您寻求的速度 . 这是我用过的some other tips .
我几乎都是整个问题,但是如果不知道返回查询的数据的细节,该子程序做了什么,以及为什么需要为一个页面完成1600次,那么很难建议降低它 .
我将MrChrister的答案标记为我的问题的答案“你有什么优化技巧吗?” . 那里的提示很好,它设法加快脚本2秒 .
我最终发现是什么让脚本变慢了 . 在while循环中,程序员正在做很多Filter(Array) . 他基本上使用Filter(Array)来查找键/值对 .
因此,最终的解决方案是将Filter(Array)的代码更改为使用“Scripting.Dictionary”对象 . 它将代码加速了12倍 .
感谢你的回复 .
中号
看到这是一个流行的问题,我决定解释我3年前做的事情,加快了ASP脚本的速度 .
原始脚本大量使用可调整大小的数组来存储键值,因此我修改了该代码以使用Scriting.Dictionary . 例:
这比可调整大小的数组快得多 .
另一个重大变化是字符串的连接 . 原始剧本充满了:
我将其修改为:
这产生了巨大的变化 . 字符串的串联是一个巨大的瓶颈,因为字符串被丢弃然后重新初始化 .
另一种选择是:
这也是ASP.NET的一个很好的提示:使用StringBuilder而不是连接字符串 .
另一个重要变化是上下文切换 . 原始代码充满了:
3个上下文切换需要花费很多时间,所以我修改了这个:
是的,代码非常冗余,但性能更好 .
另一个小修改(实际上是一个肮脏的黑客)是在SQL查询中使用WITH(NOLOCK):
它有所作为 .
最后,我不知道这有多大帮助,但有很多复制粘贴的代码我重构为干净的函数 .
我希望找到这个thead的人会找到这些提示有用 .
如果您真的认为问题出在1函数中,为什么不将代码放在这里,以便人们可以提出优化建议 .
我经历过,在大多数情况下,您可以在经典ASP中使用StringBuilder时获得性能 . ajaxed library中的经典ASP有一个很好的StringBuilder implementation . 它使用.net StringBuilder . 这很酷,易于使用:
如果你需要做一些调整,我建议使用ajaxed库 . 它设置很快,为您提供了很多经典ASP的工具 . 例如 . 也许你在使用AJAX时可以获得一些性能(或者至少是性能的印象) .