DDR爱好者之家 Design By 杰米
可vbs根本就没有类似于StringBuilder这样的东东,所以咱哥们只能自己想办法优化了。
正文:
我写了几段代码做了测试,得出以下结果:
'普通字符串连接
StringLinkTest1() '性能最差,大约耗时20秒(最要命的是在这20秒内,整个CPU几乎是100%满负荷在运行)
'普通字符串连接,但使用了临时变量来提升效率
StringLinkTest2() '性能令人吃惊的改善,大约耗时0.2秒
'使用数组+Join函数处理
StringArrayTest() '性能最佳,大约耗时0.06秒
'本来还有个方法,是利用字典对象:Scripting.Dictionary 来操作的,但由于在大量连续使用的类方法的情况下,会直接影响效率(效率介于StringArrayTest和StringLinkTest2之间),在此就不贴了
得出的结果就是,在vbs的字符串处理上,还是可以解决效率问题的。
代码如下:
复制代码 代码如下:
<%
'vbs版高速字符串操作代码演示
'淮南子编写
Option explicit
Dim StrTime,EndTime
Dim MyString,MyArray,ArrayIndexCount,CurIndex
Const TestNumber = 9999 '循环次数
StrTime = Timer()
'============测试开始============
'代码执行效率
'本人机器配置:
'CPU: 酷睿双核2250 CPU频率:1.73G
'内存: 1GB
'请逐一开启方法进行测试
'StringLinkTest1() '性能最差,大约耗时20秒
'StringLinkTest2() '性能大大改善,大约耗时0.2秒
'StringArrayTest() '性能最佳,大约耗时0.06秒
'============测试结束============
'输出结果
'Response.Write MyString
EndTime = Timer()
Response.Write "耗时:" & FormatNumber((EndTime-StrTime) * 1000,3) & " 毫秒"
'字符串操作函数,淮南子原创
Sub Add(Value)
If (CurIndex >= ArrayIndexCount) Then
ArrayIndexCount = CurIndex * 1.1 '如果欲添加项超出数组下标,则将数组容量扩增百分之10
ReDim Preserve MyArray(ArrayIndexCount)
End If
MyArray(CurIndex) = Value
CurIndex = CurIndex + 1
End Sub
'测试方法
'使用数组进行字符串叠加,在所有方法中,该方法性能最佳(效率较StringLinkTest2()的方法提升了近4倍)
Sub StringArrayTest()
ArrayIndexCount = 20
CurIndex = 0
ReDim MyArray(ArrayIndexCount)
Dim i
For i = 0 to TestNumber
Add "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
Next
MyString = Join(MyArray,"")
End Sub
'测试方法1
'常规的字符串连接
Sub StringLinkTest1()
Dim i,str
dim a1
a1 = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
For i=0 to TestNumber
'常规字符串连接
Str=(Str&a1)
Next
MyString = Str
End Sub
'测试方法2
'在常规的字符串连接方式中,使用临时变量来提速 ,效率较StringLinkTest1()的方法提升了近100倍
Sub StringLinkTest2()
Dim i,str,a1,TmpString
a1 = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
For i=0 to TestNumber
'使用临时变量提速
TmpString = (TmpString & a1)
'每二百次则进行一次累计
If i mod 200 = 0 Then
'保存临时变量值
Str = (Str & TmpString)
'清空临时变量值
TmpString = ""
End If
Next
if TmpString<>"" Then MyString = (Str & TmpString)
End Sub
%>
如有不对之处,请大家拍拍砖,呵呵
也可以用数组来拼接字符串啦!
复制代码 代码如下:
'最简单的例子,生成num个重复的str,例如 XString(5,"<br>") '输出: <br><br><br><br><br>
Function XString(num,str)
On Error Resume Next
Dim i,a
Redim a(num-1)
For i=0 To num-1
a(i)=str
Next
XString=Join(a,"")
On Error GoTo 0
End Function
'字符串拼接类公共版
Class clsStrCat
Private aFStrings()
Private iFSPos,iFSLen,iFSIncr
Private Sub Class_Initialize()
On Error Resume Next
iFSIncr = STRCATBUF
If Err Then iFSIncr = 200 : Err.Clear
Reset
On Error GoTo 0
End Sub
Private Sub Class_Terminate()
Erase aFStrings
End Sub
Public Property Let Item(ByRef sData)
If iFSPos > iFSLen Then
iFSLen = iFSPos + iFSIncr
ReDim Preserve aFStrings(iFSLen)
End If
aFStrings(iFSPos) = sData
iFSPos = iFSPos + 1
End Property
Public Default Property Get Item()
Item = Join(aFStrings, "")
End Property
Public Sub Reset()
iFSPos = 0
iFSLen = iFSIncr
ReDim aFStrings(iFSLen)
End Sub
Public Sub Resize(n)
If Not IsNumeric(n) Then Exit Sub
iFSPos = 0
iFSIncr = n
iFSLen = iFSIncr
ReDim aFStrings(iFSLen)
End Sub
Public Property Get Strs()
Strs=aFStrings
End Property
Public Property Get Count()
Count=iFSPos
End Property
Public Property Get IsInit()
If iFSPos=0 Then IsInit=True Else IsInit=False
End Property
End Class
正文:
我写了几段代码做了测试,得出以下结果:
'普通字符串连接
StringLinkTest1() '性能最差,大约耗时20秒(最要命的是在这20秒内,整个CPU几乎是100%满负荷在运行)
'普通字符串连接,但使用了临时变量来提升效率
StringLinkTest2() '性能令人吃惊的改善,大约耗时0.2秒
'使用数组+Join函数处理
StringArrayTest() '性能最佳,大约耗时0.06秒
'本来还有个方法,是利用字典对象:Scripting.Dictionary 来操作的,但由于在大量连续使用的类方法的情况下,会直接影响效率(效率介于StringArrayTest和StringLinkTest2之间),在此就不贴了
得出的结果就是,在vbs的字符串处理上,还是可以解决效率问题的。
代码如下:
复制代码 代码如下:
<%
'vbs版高速字符串操作代码演示
'淮南子编写
Option explicit
Dim StrTime,EndTime
Dim MyString,MyArray,ArrayIndexCount,CurIndex
Const TestNumber = 9999 '循环次数
StrTime = Timer()
'============测试开始============
'代码执行效率
'本人机器配置:
'CPU: 酷睿双核2250 CPU频率:1.73G
'内存: 1GB
'请逐一开启方法进行测试
'StringLinkTest1() '性能最差,大约耗时20秒
'StringLinkTest2() '性能大大改善,大约耗时0.2秒
'StringArrayTest() '性能最佳,大约耗时0.06秒
'============测试结束============
'输出结果
'Response.Write MyString
EndTime = Timer()
Response.Write "耗时:" & FormatNumber((EndTime-StrTime) * 1000,3) & " 毫秒"
'字符串操作函数,淮南子原创
Sub Add(Value)
If (CurIndex >= ArrayIndexCount) Then
ArrayIndexCount = CurIndex * 1.1 '如果欲添加项超出数组下标,则将数组容量扩增百分之10
ReDim Preserve MyArray(ArrayIndexCount)
End If
MyArray(CurIndex) = Value
CurIndex = CurIndex + 1
End Sub
'测试方法
'使用数组进行字符串叠加,在所有方法中,该方法性能最佳(效率较StringLinkTest2()的方法提升了近4倍)
Sub StringArrayTest()
ArrayIndexCount = 20
CurIndex = 0
ReDim MyArray(ArrayIndexCount)
Dim i
For i = 0 to TestNumber
Add "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
Next
MyString = Join(MyArray,"")
End Sub
'测试方法1
'常规的字符串连接
Sub StringLinkTest1()
Dim i,str
dim a1
a1 = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
For i=0 to TestNumber
'常规字符串连接
Str=(Str&a1)
Next
MyString = Str
End Sub
'测试方法2
'在常规的字符串连接方式中,使用临时变量来提速 ,效率较StringLinkTest1()的方法提升了近100倍
Sub StringLinkTest2()
Dim i,str,a1,TmpString
a1 = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
For i=0 to TestNumber
'使用临时变量提速
TmpString = (TmpString & a1)
'每二百次则进行一次累计
If i mod 200 = 0 Then
'保存临时变量值
Str = (Str & TmpString)
'清空临时变量值
TmpString = ""
End If
Next
if TmpString<>"" Then MyString = (Str & TmpString)
End Sub
%>
如有不对之处,请大家拍拍砖,呵呵
也可以用数组来拼接字符串啦!
复制代码 代码如下:
'最简单的例子,生成num个重复的str,例如 XString(5,"<br>") '输出: <br><br><br><br><br>
Function XString(num,str)
On Error Resume Next
Dim i,a
Redim a(num-1)
For i=0 To num-1
a(i)=str
Next
XString=Join(a,"")
On Error GoTo 0
End Function
'字符串拼接类公共版
Class clsStrCat
Private aFStrings()
Private iFSPos,iFSLen,iFSIncr
Private Sub Class_Initialize()
On Error Resume Next
iFSIncr = STRCATBUF
If Err Then iFSIncr = 200 : Err.Clear
Reset
On Error GoTo 0
End Sub
Private Sub Class_Terminate()
Erase aFStrings
End Sub
Public Property Let Item(ByRef sData)
If iFSPos > iFSLen Then
iFSLen = iFSPos + iFSIncr
ReDim Preserve aFStrings(iFSLen)
End If
aFStrings(iFSPos) = sData
iFSPos = iFSPos + 1
End Property
Public Default Property Get Item()
Item = Join(aFStrings, "")
End Property
Public Sub Reset()
iFSPos = 0
iFSLen = iFSIncr
ReDim aFStrings(iFSLen)
End Sub
Public Sub Resize(n)
If Not IsNumeric(n) Then Exit Sub
iFSPos = 0
iFSIncr = n
iFSLen = iFSIncr
ReDim aFStrings(iFSLen)
End Sub
Public Property Get Strs()
Strs=aFStrings
End Property
Public Property Get Count()
Count=iFSPos
End Property
Public Property Get IsInit()
If iFSPos=0 Then IsInit=True Else IsInit=False
End Property
End Class
DDR爱好者之家 Design By 杰米
广告合作:本站广告合作请联系QQ:858582 申请时备注:广告合作(否则不回)
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
DDR爱好者之家 Design By 杰米
暂无评论...
更新日志
2024年05月17日
2024年05月17日
- 刘欢.2004-经典20年珍藏锦集【新索】【WAV+CUE】
- 中唱唱片群星《好歌珍藏-游子情深》2CDWAV
- CD圣经上榜天碟1995-乌仁娜-《蒙古草原之歌》[WAV+CUE].
- 【电影原声】武满彻《旭日东升》1993[WAV+CUE整轨]
- Taylor Swift《THE TORTURED POETS DEPARTMENT》[320K/MP3][148.54MB]
- Taylor Swift《THE TORTURED POETS DEPARTMENT》[FLAC/分轨][405.72MB]
- Joyce Jonathan《法式松弛感 漫步香榭丽舍》[320K/MP3][80.8MB]
- 女神异闻录5佐仓双叶coop攻略 p5r佐仓双叶对话选项攻略
- 【民谣】张智《尼勒克小镇》[FLAC]
- 林一峰2018-TRAVELOGUE4ESCAPE[香港首版][WAV+CUE]
- MollyLewis《OnTheLips》(2024)[Hi-Res96kHz_24bitFLAC]
- Joyce Jonathan《法式松弛感 漫步香榭丽舍》[FLAC/分轨][230.77MB]
- 群星《影视剧 春色寄情人 原声带》[320K/MP3][394.18MB]
- 吴牧野《强者独白II 李斯特巅峰作品选》[320K/MP3][216.01MB]
- 女神异闻录5御船千早coop攻略 p5r御船千早对话选项攻略