一直听说asp比其他语言的效率低,其实不然,效率低只是程序人员在开发的过程中的方法效率低而已,这与语言效率低没有关系。
在实际开发过程中,我发现asp一个效率低的地方,就是&连接符的效率低,但我们换个方法,也可以直接提高它的效率。我们比较一下下面的两种方法:
<%
class strCat
Private index, ub, ar()
Private Sub Class_Initialize()
'statements
redim ar(50)
index=0
ub=10
End Sub
Private Sub Class_Terminate()
'statements
erase ar
End Sub
public default Sub Add(value)
ar(index)=value
index=index+1
if index>ub then
ub=ub+50
redim preserve ar(ub)
end if
end sub
public Function display
redim preserve ar(index-1)
display=join(ar,"")
end function
end class
'方法一:使用&连接符
t1=timer
os=""
for i=1 to 10000
os=os & "www.aspbc.com"&i&" "
next
s=os
t2=timer
response.Write("<br>Using the fast string class: " &t2-t1 & "<hr>")
'方法二:使用自定义的类
t3=timer
set cat= new strCat
for i=1 to 10000
cat("www.aspbc.com")
next
s= cat.display
set cat = nothing
t4=timer
response.Write("<br>Using the fast string class: " &t4-t3 & "<hr>")
%>
- '下面仅列出主要代码。[读取SQL结果到二维数组 UserInfo 中略]
- 'UserInfo = 0 ID,1 SV_ID,2 RECORD,3 Province,4 City,5 Name,6 Sex,7 Address,8 PostCode,9 Phone,10 OtherInfo,11 UserName,12 IP,13 DateTime
- Dim OutputText '输出文本内容
- Dim SurveyInfo '调查基本信息
- Dim TempItemText '临时中间字符串连接变量(*关键)
- '.
- For i=0 To UBound(UserInfo,2)
- TempItemText = TempItemText & (VbCrLf & "姓名:" & UserInfo(5,i) & VbCrLf & _
- "省份:" & UserInfo(3,i) & " 城市:" & UserInfo(4,i) & VbCrLf & _
- "联系地址:" & UserInfo(7,i) & " 邮编:" & UserInfo(8,i) & VbCrLf & _
- "电话:" & UserInfo(9,i) & VbCrLf)
-
- ' [OtherInfo 用户其他资料特殊资料的处理,与上面相同需要 0 次 OutputText连接 代码略]
- TempItemText = TempItemText & ("IP:" & UserInfo(12,i) & " Time:" & UserInfo(13,i) & VbCrLf & _
- "------------------------------------------------------------" & VbCrLf)
- '减少10倍大字符串连接
- If ((i+1) Mod 10) =0 Then
- OutputText = OutputText & TempItemText
- TempItemText = ""
- End If
- Next
- If TempItemText<>"" Then
- OutputText = OutputText & TempItemText
- End If
可以看出代码增加了一个中间变量TempItemText用来连接每个用户资料,直接减少OutputText连接3倍。又通过 i 于 10取余数,大约每10个用户资料连接一次OutputText,再次减少10倍。Next后增加一个代码对最后可能的<10个用户的资料进行次 OutputText连接。总共优化15次OutputText连接。
至此在没有使用StringBuilder的情况下,将程序优化到0.7s,已能满足项目要求。
总结:一、利用表达式优先级减少对大字符串连接次数。(仅增加一对括号,对原代码的影响很少*推荐)
二、利用小字符串做中间变量减少对大字符串连接次数。
三、这个优化方法适用范围不局限在ASP中(C#等)。