VBGood网站全文搜索 Google

搜索VBGood全站网页(全文搜索)

VB爱好者乐园(VBGood)

 找回密码
 立即注册
搜索
查看: 3032|回复: 6

[推荐] for-next执行速度太慢的问题,受不了了

[复制链接]
发表于 2013-2-19 22:03:05 | 显示全部楼层 |阅读模式
Private yuanshi() As String '定义成模块变量


Private Sub Form_Load()
Dim i As Integer, j As Integer
Dim abcd As Long
abcd = Len(Text2(0).Text)
reDim yuanshi(1 To abcd) As String
i = 1
For j = 1 To abcd
   If Mid(Text2(0).Text, j, 1) <> Chr(10) And Mid(Text2(0).Text, j, 1) <> Chr(13) Then
      yuanshi(i) = Mid(Text2(0).Text, j, 1)
      i = i + 1
   End If
Next j
end sub
Text2(0).Text中的内容为附件文件中的内容,(包含空格)大约有32000个字符,该段程序目的是要将Text2(0).Text中内容的有效字符逐字读入数组yuanshi()中,但是程序在执行时耗时近20秒,让人无法承受,请高手们支招一下,看看有没有什么更高效率的方法来实现。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

点评

tgy
不是for慢,而是操作字符串慢  发表于 2013-2-21 09:25
首先尽量别用字符串操作,速度很慢,其次mid后加个$,效率提高很多  发表于 2013-2-20 18:52
发表于 2013-2-19 23:37:32 | 显示全部楼层
Dim s As String
s=Text2(0).Text
然后后面所有Text2(0).Text都替换成s,这样应该会快一些

点评

没错,访问控件的速度是很慢的。所以不要在大量循环里访问控件。  发表于 2013-2-21 07:58
这个是关键,编译器无法优化  发表于 2013-2-20 19:39
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-2-20 15:19:51 | 显示全部楼层
是的,程序执行效率显著提高,谢谢各位高手指点!
回复 支持 反对

使用道具 举报

发表于 2013-2-20 18:55:45 | 显示全部楼层
s$ =Text2(0).Text
s= replace(s,vbcr,vbnullstring)
s= replace(s,vblf,vbnullstring)
n& = len(s)
redim b(n-1)
for i = 1 to n
b(i-1)  = mid$(s,i,1)
next

我猜replace的速度应该比你1个1个比对要快

评分

参与人数 1人气 +1 收起 理由
SPHINX + 1 谢谢

查看全部评分

回复 支持 反对

使用道具 举报

发表于 2013-2-20 19:35:05 | 显示全部楼层
  1. Option Explicit

  2. Private yuanshi() As String '定义成模块变量


  3. Private Sub Command1_Click()
  4.   Dim i As Integer, j As Integer
  5.   Dim L As Long
  6.   Dim st As Single
  7.   
  8.   st = Timer
  9.   
  10.   L = Len(txt.Text)
  11.   ReDim yuanshi(1 To L) As String
  12.   
  13.   i = 1
  14.   
  15.   For j = 1 To L
  16.      If Mid(txt.Text, j, 1) <> Chr(10) And Mid(txt.Text, j, 1) <> Chr(13) Then
  17.         yuanshi(i) = Mid(txt.Text, j, 1)
  18.         i = i + 1
  19.      End If
  20.   Next j
  21.   
  22.   Debug.Print Timer - st
  23.   MsgBox Timer - st
  24. End Sub

  25. Private Sub Command2_Click()
  26.   Dim i As Integer, j As Integer
  27.   Dim L As Long
  28.   Dim st As Single
  29.   Dim s As String
  30.   
  31.   st = Timer
  32.   
  33.   s = txt.Text
  34.   L = Len(s)
  35.   ReDim yuanshi(1 To L) As String
  36.   
  37.   i = 1
  38.   
  39.   For j = 1 To L
  40.     If Mid(s, j, 1) <> Chr(10) And Mid(s, j, 1) <> Chr(13) Then
  41.       yuanshi(i) = Mid(s, j, 1)
  42.       i = i + 1
  43.     End If
  44.   Next j
  45.   
  46.   Debug.Print Timer - st
  47.   MsgBox Timer - st

  48. End Sub

  49. Private Sub Command3_Click()
  50.   Dim i As Integer, j As Integer
  51.   Dim L As Long
  52.   Dim st As Single
  53.   Dim s As String
  54.   Dim Ch As String * 1
  55.   
  56.   st = Timer
  57.   
  58.   s = txt.Text
  59.   L = Len(s)
  60.   ReDim yuanshi(1 To L) As String
  61.   
  62.   i = 1
  63.   
  64.   For j = 1 To L
  65.     Ch = Mid(s, j, 1)
  66.     If Ch <> Chr(10) And Ch <> Chr(13) Then
  67.       yuanshi(i) = Ch
  68.       i = i + 1
  69.     End If
  70.   Next j
  71.   
  72.   Debug.Print Timer - st
  73.   MsgBox Timer - st
  74. End Sub

  75. Private Sub Command4_Click()
  76.   Dim i As Integer
  77.   Dim L As Long
  78.   Dim st As Single
  79.   Dim s As String
  80.   Dim Ch As String * 1
  81.   
  82.   st = Timer
  83.   
  84.   s = Replace(txt.Text, vbCrLf, "")
  85.   L = Len(s)
  86.   ReDim yuanshi(1 To L) As String
  87.   
  88.   For i = 1 To L
  89.     yuanshi(i) = Mid(s, i, 1)
  90.   Next i
  91.   
  92.   Debug.Print Timer - st
  93.   MsgBox Timer - st
  94. End Sub

  95. Private Sub Command5_Click()
  96.   Dim i As Integer
  97.   Dim L As Long
  98.   Dim st As Single
  99.   Dim s As String
  100.   Dim Ch As String * 1
  101.   
  102.   st = Timer
  103.   
  104.   s = Replace(txt.Text, vbCrLf, "")
  105.   L = Len(s)
  106.   ReDim org(1 To L) As Byte
  107.   
  108.   org = s
  109.   
  110.   Debug.Print Timer - st
  111.   MsgBox Timer - st
  112. End Sub
复制代码
IDE:

Command1_Click
22.75
22.57031
22.55469

Command2_Click
.03125
.046875
.0390625

Command3_Click
.0390625
.046875
.0390625

Command4_Click
.0078125
.0234375
.0234375

Command5_Click
0
0
0

按速度优化 exe:

Command1_Click
22.64844
22.25
22.33594

Command2_Click
.0390625
.0390625
.0390625

Command3_Click
.0390625
.0390625
.0390625

Command4_Click
.0234375
.015625
.0234375

Command5_Click
0
0
0


看来编译器的优化不够啊,反复读控件属性的代码不会替换为内存变量。不过仔细想想不优化这个也是有道理的,万一第二次读 txt.Text 的时候它的值发生了变化那就错误了。

点评

反复读控件属性的代码是不会优化的,因为谁知道Property Get里面的代码是怎么写的呢(八成是SendMessage),可能会每次都不一样的,而且又不是inline,如果是自动inline的话编译器就会优化  发表于 2013-2-21 14:20
⊙﹏⊙b 你写了结果,我当然知道运行过,我的意思是:文件30多K,长度大概是39000,i的值最大也是39000多,为啥integer的i、j没有溢出。能把读取文件的部分贴出来看看么,我和自己的对比下。  发表于 2013-2-21 12:38
我就是试验过的才复制粘贴过来,怎么不能运行?我电脑是09年9月买的,E5300,2G内存,XP  发表于 2013-2-20 21:18
确定能运行么……我把所有的integer全换long了。话说你电脑真快……我的时间57、.08、.08、.03、0 。  发表于 2013-2-20 21:13
回复 支持 反对

使用道具 举报

发表于 2013-2-21 08:52:04 | 显示全部楼层
一句yuanshi=split(text2(0),vbcrlf)就可以全部解决,顶多几毫秒。
回复 支持 反对

使用道具 举报

发表于 2013-2-21 16:13:09 | 显示全部楼层
@sailingzyf3.0  ⊙_⊙b 你写了结果,我当然知道运行过,我的意思是:文件30多K,长度大概是39000,i的值最大也是39000多,为啥integer的i、j没有溢出。能把读取文件的部分贴出来看看么,我和自己的对比下。

汗,幸好你提醒,不然我都没发现问题。我是复制粘贴进文本框的,被自动截断了,看来楼主的电脑才是真的强

点评

嘛~其实回复的时候就感觉你的文本不够长,原来是误操作……文本框不是最长64K么,我复制粘贴了下,全在。电脑嘛,我的是09年底的中配本,比台式机的话……  发表于 2013-2-21 20:04
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

文字版|手机版|小黑屋|VBGood  

GMT+8, 2022-7-5 00:20

VB爱好者乐园(VBGood)
快速回复 返回顶部 返回列表