当前位置 博文首页 > vbs的字符串操作效率分析总结

    vbs的字符串操作效率分析总结

    作者:admin 时间:2021-02-13 15:04

    可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
    js
下一篇:没有了