日期:2019年11月2日
作者:Commas
注释:字符串拼接是一个常规的操作,随着字符串不断增大,字符串拼接耗时也越来越长,那么提升字符串拼接效率的话题就是一个十分值得探讨的话题,接下来我们用数据说话,浅谈一下VB6提升字符串拼接效率的问题吧。
目录
一、借数据说话
序号 | 字符串拼接方式 | 4*10^6长度字符串耗时 | 4*10^5长度字符串耗时 | 4*10^4长度字符串耗时 |
---|---|---|---|---|
1 | 直接拼接& | 2950s | 17s | 0s |
2 | 直接拼接+ | 2942s | 17s | 0s |
3 | 数组拼接Join | <1s | 0s | 0s |
备注:以上测试时间精确度为秒级
从上表中,我们可以得出以下结论:
- 对于大字符串处理,字符串数组拼接速度远远远大于字符串直接拼接速度;
- 对于小字符串处理,三种拼接方式在耗时上基本持平;
分析: 字符串直接拼接("&"、"+"),在小字符串处理(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