asp 性能测试报告 学习asp朋友需要了解的东西
来源:asp之家 发布时间:2011-03-09 10:57:00
在服务器上生成动态内容是使用ASP最主要的原因之一,所以我们选择的第一个测试项目是确定把动态内容发送到应答流使用什么方法最好。基本的选择有两种(以及它们的一些变化):使用内嵌ASP标记,使用Response.Write语句。
为测试这些不同的方法,我们创建了一个简单的ASP页面,页面先定义一些变量然后把它们插入到表格。虽然这个页面很简单,而且没有实际用途,但它足以让我们分离和测试各个问题。
2.1 使用ASP内嵌标记
第一个测试是使用ASP的内嵌标记<%= x %>,其中x是一个变量。这是使用最方便的方法,而且它可以让页面的HTML部分变得更容易阅读和维护。
代码如下:
<% OPTION EXPLICIT
Dim FirstName
Dim LastName
Dim MiddleInitial
Dim Address
Dim City
Dim State
Dim PhoneNumber
Dim FaxNumber
Dim EMail
Dim BirthDate
FirstName = "John"
MiddleInitial = "Q"
LastName = "Public"
Address = "100 Main Street"
City = "New York"
State = "NY"
PhoneNumber = "1-212-555-1234"
FaxNumber = "1-212-555-1234"
EMail = "john@public.com"
BirthDate = "1/1/1950"
%>
<HTML>
<HEAD>
<TITLE>Response Test</ TITLE>
</HEAD>
<BODY>
<H1>Response Test</H1>
<TABLE>
<tr><td><b>First Name:</b></td><td><%= FirstName %></td></tr>
<tr><td><b>Middle Initial:</b></td><td><%= MiddleInitial %></td></tr>
<tr><td><b>Last Name:</b></td><td><%= LastName %></td></tr>
<tr><td><b>Address:</b></td><td><%= Address %></td></tr>
<tr><td><b>City:</b></td><td><%= City %></td></tr>
<tr><td><b>State:</b></td><td><%= State %></td></tr>
<tr><td><b>Phone Number:</b></td><td><%= PhoneNumber %></td></tr>
<tr><td><b>Fax Number:</b></td><td><%= FaxNumber %></td></tr>
<tr><td><b>EMail:</b></td><td><%= EMail %></td></tr>
<tr><td><b>Birth Date:</b></td><td><%= BirthDate %></td></tr>
</TABLE>
</BODY>
</HTML>
/app1/response1.asp的完整代码
最好记录 = 8.28 毫秒/页
2.2 使用Response.Write输出每一行HTML代码
许多优秀的文献指出,应当避免使用前面的内嵌标记方法,因为它导致一个称为“上下文切换”的操作。这个操作发生在Web服务器所处理的代码类型发生变化的时候(从纯HTML的发送到脚本处理,或反过来),这种切换需要一定的时间。许多程序员在了解了这一点之后,他们的第一个反应是将每一行HTML代码都用Response.Write函数来输出:
代码如下:
...
Response.Write("<html>")
Response.Write("<head>")
Response.Write(" <title>Response Test</title>")
Response.Write("</head>")
Response.Write("<body>")
Response.Write("<h1>Response Test</h1>")
Response.Write("<table>")
Response.Write("<tr><td><b>First Name:</b></td><td>" & FirstName & "</td></tr>")
Response.Write("<tr><td><b>Middle Initial:</b></td><td>" & MiddleInitial & "</td></tr>")
...
/app1/response2.asp片断
最好记录 = 8.28 毫秒/页
响应时间 = 8.08 毫秒/页
差 额 = -0.20 毫秒 (减少 2.4%)
和内嵌标记版本相比,我们所看到的性能改善非常小,简直令人惊讶。这或许是因为页面中多出了许多函数调用。不过这种方法还有一个更大的缺点,由于HTML代码嵌入到了函数内,脚本代码变得非常冗长,阅读和维护都不方便。
2.3 使用封装函数
Response.Write并不会在文本行的末尾加上CRLF(Carriage Return - Line Feed,回车换行),这是使用上面这种方法最令人失望的地方。尽管已经在服务器端把HTML代码作了很好的格式化,但在浏览器中看到的仍旧只有长长的一行代码。不过失望的不仅是这一个问题,人们很快就发现不存在能够自动添加CRLF的Response.WriteLn函数。一个很自然的反应就是创建Response.Write的封装函数,在每行的后面加上CRLF:
...
writeCR("<tr><td><b>First Name:</b></td><td>" & FirstName & "</td></tr>")
...
SUB writeCR(str)
Response.Write(str & vbCRLF)
END SUB
/app1/response4.asp片断
最好记录 = 8.08 毫秒/页
响应时间 = 10.11 毫秒/页
差 额 = +2.03 毫秒 (增加 25.1%)
结果是性能的大大下降。当然,这主要是因为这种方法使得函数的调用次数加倍,它对性能的影响非常明显。应当不惜代价地避免这种用法,CRLF导致每行的末尾多了两个字节,而这两个字节对于浏览器显示页面是没有用的。在大多数情况下,浏览器端HTML代码的格式美观只是方便了你的竞争者阅读和理解页面的设计。
2.4 合并多个Response.Write
如果不考虑最后一次有关封装函数的测试,下一个合理的步骤应当是将所有字符串从分开的Response.Write语句合并到一个语句,从而减少函数调用次数、提高代码运行效率。
代码如下:
Response.Write("<html>" & _
"<head>" & _
"<title>Response Test</title>" & _
"</head>" & _
"<body>" & _
"<h1>Response Test</h1>" & _
"<table>" & _
"<tr><td><b>First Name:</b></td><td>" & FirstName & "</td></tr>" & _
...
"<tr><td><b>Birth Date:</b></td><td>" & BirthDate & "</td></tr>" & _
"</table>" & _
"</body>" & _
"</html>")
/app1/response3.asp片断
最好记录 = 8.08 毫秒/页
响应时间 = 7.05 毫秒/页
差 额 = -1.03 毫秒 (减少 12.7%)
这是目前为止最好的方法。
2.5 合并多个Response.Write,且在每一行的末尾增加CRLF
也有人非常关注他们的HTML代码在浏览器端是否美观,因此我们又在每一行HTML代码的末尾加上了一个回车,使用的是vbCRLF常量,其他的测试代码与上例一样。
...
Response.Write("<html>" & vbCRLF & _
"<head>" & vbCRLF & _
" <title>Response Test</title>" & vbCRLF & _
"</head>" & vbCRLF & _
...
/app1/response5.asp片断
最好记录 = 7.05 毫秒/页
响应时间 = 7.63 毫秒/页
差 额 = +0.58 毫秒 (增加 8.5%)
结果是性能略有下降,这可能是因为增加了字符串连接操作,同时输出的文本也增加了。
2.6 意见
根据上述ASP输出测试的结果,我们得出如下编码规则:
避免过多地使用内嵌ASP。
把尽可能多的Response.Write语句合并成单个语句。
绝对不要为了加上CRLF而封装Response.Write。
如果要格式化HTML输出,直接在Response.Write语句后面加上CRLF。
纲要:ASP动态生成的内容以什么方式输出效率最高?最好用哪种方法提取数据库记录集?本文测试了近20个这类ASP开发中常见的问题,测试工具所显示的时间告诉我们:这些通常可以想当然的问题不仅值得关注,而且还有出乎意料的秘密隐藏在内。
猜你喜欢
- 今天同事 明城 在项目中碰到一个 BUG,代码具体如下:<!DOCTYPE html PUBLIC "-//W3C//DTD
- TO_NUMBER(char[,'format_model']) 字符转换到数字类型TO_DATE(char[,'f
- 有的时候,我们在网页中会用到复选框,也就是多选框,当用户提交输入信息的时候我们会获取复选框的内容,然后保存到数据库中,如经常用到的是用户输入
- 一、概述公司新购了一批PC,准备把几个性能较优的PC升级为数据库服务器,替换老旧的机器。公司有套POS终端软件,后台数据存储是 MySQL
- 这是官方对SubFolders的介绍:返回由指定文件夹中所有子文件夹(包括隐藏文件夹和系统文件夹)组成的 Folders 集合。object
- 当然,每个人都可以编写CSS代码,甚至你现在已经让它为你的项目工作了。但是CSS还可以更好吗?开始用这5个Tips改进你的CSS吧!1.合理
- 在VBScript中有Filter这个函数可以用来对数组进行过滤,并返回原数组的一个子集数组。语法说明: 引用内容Filter 函
- 这个效果前些日子有人在论坛问起,今天有空研究了下。我打了原创标记,因为我在写这个方法时的确没有参考过别人的代码。我的方法其实就是层遮罩加AL
- 我们可以通过更改注册表来解决这个问题: 打开注册表,进入到[HKEY_USERS\.DEFAULT\Control Panel\Intern
- 程序如下:<%Function GetEmploymentStatusListDim dd = Ap
- 汉字转换为UTF-8的一段代码终于找到这段代码了,一个ASP写的中文转UTF-8,大家可以试试function chinese2u
- 无论安装何版本的mysql,在管理工具的服务中启动mysql服务时都会在中途报错。内容为:在 本地计算机 无法启动mysql服务 错误106
- '/***' 作 者 :冻结回忆'修改时间:2007-10-17'功能说明
- 问题:连续或者单个窗体,如何打印当前显示的记录?当前窗体还有对应的子窗体,也要一起打印出来我在一个窗体里有一个单号,大子窗体里有几组数据,我
- 在mysql中利用select语句的一个特性就可以很方便地实现查询结果的分页,select语句的语法:SELECT [STRAIGHT_JO
- 当“ 页面重构工程师 ”这个职位的面试官也蛮长一段时间了,跟前两年比起来,总的来说来应聘的同学能力在很大程度上有了提高,记得两年前的一场招聘
- hanxiaolian 为了躲避 lake2 ASP站长管理助手而写.. 一.绕过lake2 Asp木马扫描的小马 代码如下:<%&n
- 当然有其它工具可以做这件事,但如果客户不允许你在服务器乱装东西时这个脚本就会有用了。 代码如下:DECLARE @tbImportTable
- SWFUpload上传组件,最初由Vinterwebb.se开发,组件主体由Flash与JavaScript整合而成,主要致力解决多文件、大
- Google以其简洁的搜索框引领着互联网,搜索系统似乎成了每个网站必备品,甚至于是那些本身几乎是由静态页面组成的企业网站都要来个搜索功能,这