字符串连接并显示的方式的速度差别测试代码,1000倍啊....
Option Explicit'字符串连接并显示的方式的速度差别
'
'工程里加入一个文本框,MultiLine=True,ScrollBars=2,再加入一个按钮
'
'By 嗷嗷叫的老马
'http://www.m5home.com/
Private Declare Function GetTickCount Lib "kernel32.dll" () As Long
Private Sub Command1_Click()
Dim I As Long, J As Long, K As Long, L As Long
Dim Arr1() As String, Arr2() As String, Arr3() As String
Dim buffArr() As String
Dim STT As Long
Text1.Font = "宋体"
Text1.Font.Size = 9
STT = GetTickCount
J = 65
K = 66
L = 67
ReDim Arr1(10000)
ReDim Arr2(10000)
ReDim Arr3(10000)
For I = 0 To 10000
Arr1(I) = String(5, Chr(J))
Arr2(I) = String(5, Chr(K))
Arr3(I) = String(5, Chr(L))
If J = 90 Then
J = 65
Else
J = J + 1
End If
If K = 90 Then
K = 65
Else
K = K + 1
End If
If L = 90 Then
L = 65
Else
L = L + 1
End If
Next
Debug.Print "生成数组时间(ms) ="; GetTickCount - STT
MsgBox "OK1"
STT = GetTickCount
ReDim buffArr(10000)
For I = 0 To 10000
buffArr(I) = Arr1(I) & "," & Arr2(I) & "," & Arr3(I) '中间结果保存到一个字符串数组
Next
Text1.Text = Join(buffArr(), vbCrLf) '使用join一次性连接,并赋值给文本框
Debug.Print "使用中间变量保存并使用Join一次性填充时间(ms) ="; GetTickCount - STT
MsgBox "OK2"
Text1.Text = ""
STT = GetTickCount
For I = 0 To 10000
Text1.Text = Text1.Text & Arr1(I) & "," & Arr2(I) & "," & Arr3(I) & vbCrLf
Next
Debug.Print "使用控件属性直接填充时间(ms) ="; GetTickCount - STT
MsgBox "OK3"
End Sub我这里是37/126/18XXXX,时间太长了.........差不多有2000倍的性能差. 可以使用Mid语句 不是Mid函数 先定义一个字符串变量并用Str=Space(长度)赋予足够长度
然后用Mid(Str,起始,长度)=数据来给字符串中的一段赋值 速度非常快 wszjljx 发表于 2013-1-3 19:42 static/image/common/back.gif
可以使用Mid语句 不是Mid函数 先定义一个字符串变量并用Str=Space(长度)赋予足够长度
然后用Mid(Str,起始, ...
只要不是动态分配,控件属性,以及直接用&连接,都会快很多的.
CSDN上有个算法很牛的MM叫小仙妹,我见过她给别人优化算法时常用的手法就是预分配足够的空间,然后再进行后续处理,最后再释放多余的空间,每次申请都是比较大的一块,而不是平常的需要时再一点一点扩大.
那种做法的结果就是她写的算法都极快,好象说是VB6下最快的BASE64算法就是她写的. 是的 反复分配内存的确是很花时间的....... wszjljx 发表于 2013-1-6 20:49 static/image/common/back.gif
是的 反复分配内存的确是很花时间的.......
小仙妹对她的那种预分配大量空间,然后在最后再回收的做法起了个名,叫"秋后算账"法,哈哈. 的确是蛮形象的 我现在在做的一个GET/POST方式下载文件的模块里面就先用HttpQueryInfo获取到数据大小 直接分配空间 如果获取的数据大小不准确 不够再补空间 多了裁剪空间 效率的确提高很多 wszjljx 发表于 2013-1-8 18:33 static/image/common/back.gif
的确是蛮形象的 我现在在做的一个GET/POST方式下载文件的模块里面就先用HttpQueryInfo获取到数据大小 直接 ...
确实,Redim Preserve很浪费时间,每次都要把整个数组重新复制一次.
小仙妹对此的解释在这里:
http://bbs.csdn.net/topics/340186353#post-342404372 代码很不错
页:
[1]