找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
查看: 9161|回复: 7

[交流] 字符串连接并显示的方式的速度差别测试代码,1000倍啊....

[复制链接]

275

主题

3020

回帖

1

精华

管理员

嗷嗷叫的老马

积分
17067

论坛牛人贡献奖关注奖最佳版主进步奖人气王疯狂作品奖精英奖赞助论坛勋章乐于助人勋章

QQ
发表于 2012-10-4 23:45:38 | 显示全部楼层 |阅读模式
  1. Option Explicit
  2.   '字符串连接并显示的方式的速度差别
  3.   '
  4.   '工程里加入一个文本框,MultiLine=True,ScrollBars=2,再加入一个按钮
  5.   '
  6.   'By 嗷嗷叫的老马
  7.   'http://www.m5home.com/
  8.   
  9.   Private Declare Function GetTickCount Lib "kernel32.dll" () As Long
  10.   
  11.   Private Sub Command1_Click()
  12.       Dim I As Long, J As Long, K As Long, L As Long
  13.       Dim Arr1() As String, Arr2() As String, Arr3() As String
  14.       Dim buffArr() As String
  15.       Dim STT As Long
  16.       
  17.       Text1.Font = "宋体"
  18.       Text1.Font.Size = 9
  19.       
  20.       STT = GetTickCount
  21.       
  22.       J = 65
  23.       K = 66
  24.       L = 67
  25.       
  26.       ReDim Arr1(10000)
  27.       ReDim Arr2(10000)
  28.       ReDim Arr3(10000)
  29.       
  30.       For I = 0 To 10000
  31.           Arr1(I) = String(5, Chr(J))
  32.           Arr2(I) = String(5, Chr(K))
  33.           Arr3(I) = String(5, Chr(L))
  34.          
  35.           If J = 90 Then
  36.               J = 65
  37.           Else
  38.               J = J + 1
  39.           End If
  40.           If K = 90 Then
  41.               K = 65
  42.           Else
  43.               K = K + 1
  44.           End If
  45.           If L = 90 Then
  46.               L = 65
  47.           Else
  48.               L = L + 1
  49.           End If
  50.       Next
  51.       
  52.       Debug.Print "生成数组时间(ms) ="; GetTickCount - STT
  53.       MsgBox "OK1"
  54.       
  55.       STT = GetTickCount
  56.       
  57.       ReDim buffArr(10000)
  58.       
  59.       For I = 0 To 10000
  60.           buffArr(I) = Arr1(I) & "," & Arr2(I) & "," & Arr3(I)        '中间结果保存到一个字符串数组
  61.       Next
  62.       
  63.       Text1.Text = Join(buffArr(), vbCrLf)            '使用join一次性连接,并赋值给文本框
  64.       
  65.       Debug.Print "使用中间变量保存并使用Join一次性填充时间(ms) ="; GetTickCount - STT
  66.       MsgBox "OK2"
  67.       
  68.       Text1.Text = ""
  69.       STT = GetTickCount
  70.   
  71.       For I = 0 To 10000
  72.           Text1.Text = Text1.Text & Arr1(I) & "," & Arr2(I) & "," & Arr3(I) & vbCrLf
  73.       Next
  74.   
  75.       Debug.Print "使用控件属性直接填充时间(ms) ="; GetTickCount - STT
  76.       MsgBox "OK3"
  77.   End Sub
复制代码
我这里是37/126/18XXXX,时间太长了.........差不多有2000倍的性能差.
我就是嗷嗷叫的老马了......

21

主题

162

回帖

4

精华

论坛元老

Tokyo-Hot

积分
5945
QQ
发表于 2013-1-3 19:42:26 | 显示全部楼层
可以使用Mid语句 不是Mid函数 先定义一个字符串变量并用Str=Space(长度)赋予足够长度
然后用Mid(Str,起始,长度)=数据来给字符串中的一段赋值 速度非常快
洗澡脱光衣服打开水才发现自己没带洗发水没带沐浴乳只带了一包洗衣粉 心酸的用洗衣粉把自己搓了一遍... ...

275

主题

3020

回帖

1

精华

管理员

嗷嗷叫的老马

积分
17067

论坛牛人贡献奖关注奖最佳版主进步奖人气王疯狂作品奖精英奖赞助论坛勋章乐于助人勋章

QQ
 楼主| 发表于 2013-1-6 02:43:20 | 显示全部楼层
wszjljx 发表于 2013-1-3 19:42
可以使用Mid语句 不是Mid函数 先定义一个字符串变量并用Str=Space(长度)赋予足够长度
然后用Mid(Str,起始, ...

只要不是动态分配,控件属性,以及直接用&连接,都会快很多的.

CSDN上有个算法很牛的MM叫小仙妹,我见过她给别人优化算法时常用的手法就是预分配足够的空间,然后再进行后续处理,最后再释放多余的空间,每次申请都是比较大的一块,而不是平常的需要时再一点一点扩大.

那种做法的结果就是她写的算法都极快,好象说是VB6下最快的BASE64算法就是她写的.
我就是嗷嗷叫的老马了......

21

主题

162

回帖

4

精华

论坛元老

Tokyo-Hot

积分
5945
QQ
发表于 2013-1-6 20:49:14 | 显示全部楼层
是的 反复分配内存的确是很花时间的.......
洗澡脱光衣服打开水才发现自己没带洗发水没带沐浴乳只带了一包洗衣粉 心酸的用洗衣粉把自己搓了一遍... ...

275

主题

3020

回帖

1

精华

管理员

嗷嗷叫的老马

积分
17067

论坛牛人贡献奖关注奖最佳版主进步奖人气王疯狂作品奖精英奖赞助论坛勋章乐于助人勋章

QQ
 楼主| 发表于 2013-1-7 02:53:15 | 显示全部楼层
wszjljx 发表于 2013-1-6 20:49
是的 反复分配内存的确是很花时间的.......

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

21

主题

162

回帖

4

精华

论坛元老

Tokyo-Hot

积分
5945
QQ
发表于 2013-1-8 18:33:20 | 显示全部楼层
的确是蛮形象的 我现在在做的一个GET/POST方式下载文件的模块里面就先用HttpQueryInfo获取到数据大小 直接分配空间 如果获取的数据大小不准确 不够再补空间 多了裁剪空间 效率的确提高很多
洗澡脱光衣服打开水才发现自己没带洗发水没带沐浴乳只带了一包洗衣粉 心酸的用洗衣粉把自己搓了一遍... ...

275

主题

3020

回帖

1

精华

管理员

嗷嗷叫的老马

积分
17067

论坛牛人贡献奖关注奖最佳版主进步奖人气王疯狂作品奖精英奖赞助论坛勋章乐于助人勋章

QQ
 楼主| 发表于 2013-1-8 23:45:26 | 显示全部楼层
wszjljx 发表于 2013-1-8 18:33
的确是蛮形象的 我现在在做的一个GET/POST方式下载文件的模块里面就先用HttpQueryInfo获取到数据大小 直接 ...

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

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

http://bbs.csdn.net/topics/340186353#post-342404372
我就是嗷嗷叫的老马了......

30

主题

693

回帖

0

精华

钻石会员

积分
2815
发表于 2015-4-27 10:31:16 | 显示全部楼层
代码很不错
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

快速回复 返回顶部 返回列表