浅谈VB6字符串拼接效率

日期:2019年11月2日
作者:Commas
注释:字符串拼接是一个常规的操作,随着字符串不断增大,字符串拼接耗时也越来越长,那么提升字符串拼接效率的话题就是一个十分值得探讨的话题,接下来我们用数据说话,浅谈一下VB6提升字符串拼接效率的问题吧。


目录


一、借数据说话

序号字符串拼接方式4*10^6长度字符串耗时4*10^5长度字符串耗时4*10^4长度字符串耗时
1直接拼接&2950s17s0s
2直接拼接+2942s17s0s
3数组拼接Join<1s0s0s

备注:以上测试时间精确度为秒级

从上表中,我们可以得出以下结论:

  • 对于大字符串处理,字符串数组拼接速度远远远大于字符串直接拼接速度;
  • 对于小字符串处理,三种拼接方式在耗时上基本持平;

分析: 字符串直接拼接("&"、"+"),在小字符串处理(2^16 个字符以内)中,是属于定长字符串拼接,只会在声明字符串变量的时候申请一次内存空间,不会有其他的额外资源消耗。但是随着处理的字符串不断增大,就会由定长字符串转为变长字符串,那么就会每次执行字符串拼接操作的时候重新申请内存空间,这种资源消耗叠加效应等弊端就逐渐暴露出来,而字符串数组拼接(Join(SourceArray, [Delimiter])),开始就申明数组,确定了栈内存大小,数组中每个元素赋值就可以控制在一个小字符串的赋值操作,所以这种操作效率还是比较快速的;

'数组转为字符串的函数:
Function Join(SourceArray, [Delimiter]) As String
    VBA.Strings 的成员
    Join array elements into a string

知识加油站:
“VB6 String 数据类型” 有两种:变长与定长的字符串。
1、变长字符串最多可包含大约 20 亿 ( 2^31)个字符。
2、定长字符串可包含 1 到大约 64K ( 2^16 ) 个字符。

二、写源码参考

Option Explicit

Private Sub Form_Load()
On Error Resume Next
    Dim t1 As Date, t2 As Date
    Dim i As Long, strTemp As String, aryRow() As String
    
    Dim strX As String: strX = "ABCD"
    Dim lngMax As Long: lngMax = 999999'99999'9999
    
    '(1)数组字符串连接
    t1 = Now()
    ReDim aryRow(lngMax)
    For i = 0 To lngMax
        'DoEvents '为了防止卡死,这样会多花一秒时间
        aryRow(i) = strX
    Next i
    strTemp = Join(aryRow, "")
    t2 = Now()
    'Debug.Print strTemp
    Debug.Print "字符串长度" & Len(strTemp) & ",耗时1=" & Abs(DateDiff("s", t1, t2))
    
    Debug.Print "华丽的分隔线----------"
    
    '(2)字符串直接拼接
    '(2-1)字符串直接拼接(+)
    strTemp = ""
    t1 = Now()
    For i = 0 To lngMax
        DoEvents '为了防止卡死,这样会多花一秒时间
        'strTemp = strTemp & strX
        strTemp = strTemp + strX
    Next i
    t2 = Now()
    'Debug.Print strTemp
    Debug.Print "字符串长度" & Len(strTemp) & ",耗时2=" & Abs(DateDiff("s", t1, t2))
    
    Debug.Print "华丽的分隔线----------"
    
    '(2-3)字符串直接拼接(&)
    strTemp = ""
    t1 = Now()
    For i = 0 To lngMax
        DoEvents '为了防止卡死,这样会多花一秒时间
        strTemp = strTemp & strX
    Next i
    t2 = Now()
    'Debug.Print strTemp
    Debug.Print "字符串长度" & Len(strTemp) & ",耗时3=" & Abs(DateDiff("s", t1, t2))
End Sub

控制台输出结果:
字符串长度4000000,耗时1=0
华丽的分隔线----------
字符串长度4000000,耗时2=2942
华丽的分隔线----------
字符串长度4000000,耗时3=2950

本文参考:Microsoft Repository 2.0


版权声明:本文为博主原创文章,如需转载,请给出:
原文链接:https://blog.csdn.net/qq_35844043/article/details/102865760

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Commas.KM

码路共同进步,感恩一路有您

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值