vbs的字符串操作效率分析总结
2016-07-07来源:易贤网

可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

2025公考·省考培训课程试听预约报名

  • 报班类型
  • 姓名
  • 手机号
  • 验证码
推荐信息