浅谈ASP的Response.write输出的效率

本文原文地址为:http://miaoqiyuan.cn/p/asp-response-write-xiaolv/,转载请注明出处。

在网上看到一篇Response.write 的效率的文章,很久了,地址已经找不到了,大约说的是Response.write每行输出很慢,如果改成字符串会好一些。今天正好是星期天。有空来试验一下,看看到底对不对。

测试平台:Windows2003 SP2补丁 IIS6.0
机器配置:Intel E430 CPU(赛扬)
测试内容:
模拟一个网页输出的类,使用其Header方法,通过用函数连接的方式(Header2)连接字符串用Response.write输出,直接连接的方式(Header1)连接用Response.write输出,Response.write直接输出的方法,各执行500000次,对比运行结果。
测试代码:
见附件一
试验难题:
如果各执行500000,恐怕执行很慢,如果在浏览器中打开,恐怕将会直接导致浏览器崩溃、IIS恐怕也会崩溃。
解决方法:
1.将执行次数改为10000次。
2.用VBS脚本模拟浏览器请求,将结果保存到一个文本文件。代码见附件二
3.用{VBS脚本模拟浏览器请求的脚本的文件名}.vbs>1.txt直接将结果输出到1.txt
试验结果:
得到一个大约11.3MB的文本文件,
Header1(输出直接连接字符串):437.5
Header2(输出函数连接字符串):703.125
Header3(直接输出):1406.25
单位:毫秒
试验结论:
直接输出连接字符串的方式速度最快,执行1万次,仅为0.437秒,用函数连接的方式为0.703秒,直接用Response.write输出的方式最慢,需要1.40秒左右,大约是直接连接输出方式的3倍,函数连接后输出的2倍。直接用字符串链接的方式效率最高。如果连接的字符串需要经常变动,用函数连接的方式也是一个不错的选择。
如果注重ASP输出效率,而且内容格式不经常变动,建议直接连接。
如果注重ASP输出效率并且内容格式经常变动,建议用函数连接。
以前认为直接用Response.write输出的效率最高,现在看来是绝对错误的。

附件一:ASP测试文件

'XHTML Class By MiaoQiyuan(flycat,mqycn)
class mqycn_xhtml
	dim mqycn_Title,mqycn_Keyword,mqycn_Style,mqycn_Script,mqycn_Description,mqycn_DiyString,mqycn_html
	public Sub Class_Initialize
		mqycn_Title=""
		mqycn_Keyword=""
		mqycn_Style=""
		mqycn_Script=""
		mqycn_Description=""
		mqycn_DiyString="<xxxxxxxx>11111111</xxxxxxxx>"
	end Sub
 
	Public Function Header1()
		html_tmp="< !DOCTYPE html PUBLIC ""-//W3C//DTD XHTML 1.0 Transitional//EN"" ""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"">"&vbCrlf
		html_tmp=html_tmp&"<html xmlns=""http://www.w3.org/1999/xhtml"">"&vbCrlf
		html_tmp=html_tmp&"<head profile=""http://www.w3.org/2000/08/w3c-synd/#"">"&vbCrlf
		html_tmp=html_tmp&"<meta http-equiv=""Content-Type"" content=""text/html; charset=GB2312"" />"&vbCrlf
		html_tmp=html_tmp&"<title></title>"&vbCrlf
		html_tmp=html_tmp&"<meta name=""generator"" content=""FlyCat Images 1.0"" />"&vbCrlf
		html_tmp=html_tmp&"</head></html>"
		Header1=html_tmp&mqycn_DiyString
	End Function
 
	Public Function Header2()
		html_tmp=mqycn_line("<html xmlns=""http://www.w3.org/1999/xhtml"">","< !DOCTYPE html PUBLIC ""-//W3C//DTD XHTML 1.0 Transitional//EN"" ""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"">")
		html_tmp=mqycn_line("<head profile=""http://www.w3.org/2000/08/w3c-synd/#"">",html_tmp)
		html_tmp=mqycn_line("<meta http-equiv=""Content-Type"" content=""text/html; charset=GB2312"" />",html_tmp)
		html_tmp=mqycn_line("<title></title>",html_tmp)
		html_tmp=mqycn_line("<meta name=""generator"" content=""FlyCat Images 1.0"" />",html_tmp)
		html_tmp=mqycn_line("</head></html>",html_tmp)
		Header2=mqycn_line(mqycn_DiyString,html_tmp)
	End Function
 
	Public Sub Header3()
		response.write "< !DOCTYPE html PUBLIC ""-//W3C//DTD XHTML 1.0 Transitional//EN"" ""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"">"&vbCrlf
		response.write "<html xmlns=""http://www.w3.org/1999/xhtml"">"&vbCrlf
		response.write "<head profile=""http://www.w3.org/2000/08/w3c-synd/#"">"&vbCrlf
		response.write "<meta http-equiv=""Content-Type"" content=""text/html; charset=GB2312"" />"&vbCrlf
		response.write "<title></title>"&vbCrlf
		response.write "<meta name=""generator"" content=""FlyCat Images 1.0"" />"&vbCrlf
		response.write mqycn_DiyString&vbCrlf
		response.write "</head></html>"&vbCrlf
	End Sub
 
	Private Function mqycn_line(mqycn_t,mqycn_p)
		mqycn_line=mqycn_p&vbCrlf&mqycn_t
	End Function
 
	Public Function Header()
		times=10000
		response.write string(30,"#")
		response.write string(13," ")&times
		response.write string(30,"#")
		ttt=timer()
		for i=0 to times
			response.write header1()
		next
		tet=(timer()-ttt)*1000
		response.write string(30,"#")
		response.write string(13," ")&times
		response.write string(30,"#")
		ttt=timer()
		for i=0 to times
			response.write header2()
		next
		tdt=(timer()-ttt)*1000
		response.write string(30,"#")
		response.write string(13," ")&times
		response.write string(30,"#")
		ttt=timer()
		for i=0 to times
			call header3()
		next
		Header="Header1(输出直接连接字符串):"&tet&vbCrlf&"Header2(输出函数连接字符串):"&tdt&vbCrlf&"Header3(直接输出):"&(timer()-ttt)*1000
	End Function
end class
 
set html=new mqycn_xhtml
response.write html.Header()
%>

附件二:VBS模拟浏览器请求的脚本:

function getHTTPPage(url)  
	dim Http  
	set Http=createobject("MSXML2.XMLHTTP")  
	Http.open "GET",url,false  
	Http.send()  
	if Http.readystate<>4 then  
		exit function  
	end if  
	getHTTPPage=bytesToBSTR(Http.responseBody,"GB2312")  
	set http=nothing  
	if err.number<>0 then err.Clear  
end function  
 
Function BytesToBstr(body,Cset)  
	dim objstream  
	set objstream = CreateObject("adodb.stream")  
	objstream.Type = 1  
	objstream.Mode =3  
	objstream.Open  
	objstream.Write body  
	objstream.Position = 0  
	objstream.Type = 2  
	objstream.Charset = Cset  
	BytesToBstr = objstream.ReadText  
	objstream.Close  
	set objstream = nothing  
End Function  
 
Sub Echo(t)
	wscript.echo t&"<br />"&vbcrlf
End Sub
 
echo(getHttpPage("http://192.168.0.3/img/bin/admin"))

浅谈ASP的Response.write输出的效率》上有4条评论

  1. 蓝雨

    文章下的不错
    可是数据有点问题
    我改成3000后的结果
    Header1(输出直接连接字符串):187.9883 Header2(输出函数连接字符串):171.9971 Header3(直接输出):46.99707

发表评论

电子邮件地址不会被公开。 必填项已用*标注