马大哈 发表于 2012-10-4 23:45:38

字符串连接并显示的方式的速度差别测试代码,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倍的性能差.

wszjljx 发表于 2013-1-3 19:42:26

可以使用Mid语句 不是Mid函数 先定义一个字符串变量并用Str=Space(长度)赋予足够长度
然后用Mid(Str,起始,长度)=数据来给字符串中的一段赋值 速度非常快

马大哈 发表于 2013-1-6 02:43:20

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:14

是的 反复分配内存的确是很花时间的.......

马大哈 发表于 2013-1-7 02:53:15

wszjljx 发表于 2013-1-6 20:49 static/image/common/back.gif
是的 反复分配内存的确是很花时间的.......

小仙妹对她的那种预分配大量空间,然后在最后再回收的做法起了个名,叫"秋后算账"法,哈哈.

wszjljx 发表于 2013-1-8 18:33:20

的确是蛮形象的 我现在在做的一个GET/POST方式下载文件的模块里面就先用HttpQueryInfo获取到数据大小 直接分配空间 如果获取的数据大小不准确 不够再补空间 多了裁剪空间 效率的确提高很多

马大哈 发表于 2013-1-8 23:45:26

wszjljx 发表于 2013-1-8 18:33 static/image/common/back.gif
的确是蛮形象的 我现在在做的一个GET/POST方式下载文件的模块里面就先用HttpQueryInfo获取到数据大小 直接 ...

确实,Redim Preserve很浪费时间,每次都要把整个数组重新复制一次.

小仙妹对此的解释在这里:

http://bbs.csdn.net/topics/340186353#post-342404372

upring 发表于 2015-4-27 10:31:16

代码很不错
页: [1]
查看完整版本: 字符串连接并显示的方式的速度差别测试代码,1000倍啊....