For ii = 0 To Form9.List1.ListCount - 1 
str = Form9.List1.List(ii) 
sz = Split(str, ",") 
st = sz(0) 
Form9.List1.ListIndex = ii 
si(0) = st Mod 10 
si(1) = (st \ 10) Mod 10 
si(2) = (st \ 100) Mod 10 
si(3) = IIf(si(0) >= si(1), IIf(si(0) >= si(2), si(0), si(2)), IIf(si(1) >= si(2), si(1), si(2))) 
si(4) = IIf(si(0) <= si(1), IIf(si(0) <= si(2), si(0), si(2)), IIf(si(1) <= si(2), si(1), si(2))) 
si(5) = (si(0) Mod 2) + (si(1) Mod 2) + (si(2) Mod 2) 
si(6) = IIf(si(0) >= 5, 1, 0) + IIf(si(1) >= 5, 1, 0) + IIf(si(2) >= 5, 1, 0) 
If Form9.Check1(0).Value = 1 Then mi(0) = si(1) 
If Form9.Check1(1).Value = 1 Then mi(1) = si(5) 
If Form9.Check1(2).Value = 1 Then mi(2) = si(0) 
If Form9.Check1(3).Value = 1 Then mi(3) = si(4) 
If Form9.Check1(4).Value = 1 Then mi(4) = si(2) 
If Form9.Check1(5).Value = 1 Then mi(5) = si(3) 
If Form9.Check1(6).Value = 1 Then mi(6) = si(6) For i = MSFlexGrid1.Rows - 1 To 1 Step -1 
bb = MSFlexGrid1.TextMatrix(i, 1) 
sii(0) = bb Mod 10 
sii(1) = (bb \ 10) Mod 10 
sii(2) = (bb \ 100) Mod 10 
sii(3) = IIf(si(0) >= si(1), IIf(si(0) >= si(2), si(0), si(2)), IIf(si(1) >= si(2), si(1), si(2))) 
sii(4) = IIf(si(0) <= si(1), IIf(si(0) <= si(2), si(0), si(2)), IIf(si(1) <= si(2), si(1), si(2))) 
ww(10) = (si(0) Mod 2) + (si(1) Mod 2) + (si(2) Mod 2) 
ww(11) = IIf(si(0) >= 5, 1, 0) + IIf(si(1) >= 5, 1, 0) + IIf(si(2) >= 5, 1, 0) 
ww(0) = fq(bb) 
ww(2) = fq(bb) - (ww(3) - fq(bb)) 
ww(1) = fw(bb) 
ww(3) = si(0) + si(1) + si(2) 
ww(4) = si(3) - si(4) 
ww(5) = ww(3) - si(3) - si(4) 
ww(6) = si(3) + ww(5) - si(4) 
If Form9.Option1(2) = True And Form9.Option2(1) = True Then 
fff = False 
For dd = 0 To 6 
For j = dd + 1 To 6 For n = j + 1 To 6 
If Form9.Check1(dd).Value = 1 And Form9.Check1(j).Value = 1 And Form9.Check1(n).Value = 1 Then 
d = ww(dd) <> mi(dd) 
c = ww(j) <> mi(j) 
k = ww(n) <> mi(n) 
b = Not (d Or c Or k) If b And Form9.Check1(dd).Value Then fff = True 
End If 
Next 
Next 
Next If fff = False Then 
MSFlexGrid1.RemoveItem i 
End If 
End If 
Next 
Next 
这5个循环,导致运算慢,该如何优化或减少循环

解决方案 »

  1.   

    个人认为要写出优秀的代码,必须注意代码格式,适当的缩进会大大增加代码的可读性,你的代码就不看了,以下是一些VB优化规则● 尽可能不要使用平方根运算    实践证明,使用平方根运算将耗费很多的运行时间。比如:宁可使用语句If a * a + b * b = 4 Then ...,而不要使用达到同等目的的命令If Sqr(a * a + b * b) = 2 Then ...。    ● 用C++或者Delphi重新编写程序    虽然这个建议听起来很罕见,但为了达到更高的速度与性能,恐怕这是最终的解决方案。    ● 升级到Visual Basic版本5或者6    本地编译的可执行程序在速度上要比C++或者Delphi慢许多,但是这要比Visual Basic版本4上的非编译程序快很多。    ● 剖析应用程序    请使用性能监视器软件精确地了解程序在哪里花费大量的运行时间。Visual Basic版本4和5就自带一个这样的工具,Visual Basic版本6的企业版中也有。不要在运行已经足够快的代码上耗费时间进行优化。    ● 使用非压缩图形文件    设置表单或者图形框上的图形属性为.bmp文件,而不要是压缩的JPEG或者GIF文件。后者是按照压缩格式存放的,程序必须要进行解压缩的工作才能显示它们。    ● 预装入表单    当程序启动时,装载所有要使用的表单到内存。这样,当需要使用它们时,就可以很快的显示出来。    ● 使用数组代替集合    使用数组操作非常快。只有当需要特殊的功能比如查找关键字时,再使用集合。    ● 预分配数组大小    尽可能大的分配好数组的尺寸,这样随后就不需要使用ReDim重新定义它的长度。    ● 快速初始化数组    如果需要设置数组的所有项目为0,请使用ReDim命令重新分配大小来达到效果。这虽然会浪费一些空间,但却能大大地提高速度。    ● 快速拷贝数组    不要使用循环来在数组间进行拷贝工作,请使用更快的API函数:MemCopy或者RtlMoveMemory。    ● 使用明确的数据类型    除非必要,请不要使用Variants数据类型定义变量,而要定义明确的数据类型,比如string、char。    ● 单独定义和分配对象    定义对象和分配数值可以使用联合语句:Dim obj As New MyClass。但是这要比以下2个单独的语句运行速度慢: 
    Dim obj As MyClass  
    Set obj = New MyClass    ● 尽可能地使用整型操作符    比如:为了表示除法运算,请使用,而不是/。
         ● 判断空字符串   判断空字符串的常用方法是使用下面的语句:If my_string = "" Then... ,但是请采用另外一种方法,就是判断字符串的长度是否为0,这要比前者运行快,代码是: If Len(my_string) = 0 Then ... 。   ● 使用With命令引用多次使用的对象   这要比在每条语句中都完整地引用对象名称执行速度快许多!   ● 少有字符串操作函数   尽可能少地使用字符串操作函数,它们运行很慢。   ● 定制Select Case语句   Select Case是处理多重条件判断的语句,请将经常要用到的选择排列在前面的选项,以增加该选项提前被选择命中的机会。   ● 尽可能的使用by ref参数调用函数和子程序   ● 将从不需要的表单设置为nothing   如果有许多要标明的表单,采用这个策略,将节省内存并减少运行时间。如果只有少数几个表单,请将它们全部装载进内存并隐藏之,这样将在随后的使用中速度更快。   ● 预想一下程序的速度   对程序的运行速度进行想象是非常重要的,设想一下点击按钮后,等待10秒钟。这将是一个非常长的时间!请添加一个进程条显示程序的进展情况,用户就不会感到等待。   ● 使用mid$函数而不是mid   如果需要执行许多字符串/文件操作,请使用mid$(以及trim$等等)函数而不是mid。因为后者将数据类型看作是variant 而不是 string,速度将慢3倍。   ● 尽快显示启动表单   尽快地显示启动表单可以使程序看起来很快。在表单的Load事件中使用Show命令,从而在执行长时间的启动计算工作前就能显示出程序界面。   ● 尽可能地在Form_Load事件中放置少量的代码   ● 使用splash技术过渡中间操作   如果初始化的表单要运行很长时间,请先立即显示一个splash画面,然后在初始表单完全装载后,再去除它。关于如果创建不同种类splash画面的资料,请查阅Advanced Visual Basic Techniques。    ● 在模块中将子程序分组   当一个程序调用另外一个程序时,另外的程序所在的模块将被装载。如果一个程序需要调用多个不同模块中的程序,那么所有的这些模块都要被装载。因此,将所有相关的程序放置在一个模块中,就可以实现一次装载。   ● 不要浪费内存   有时,利用更多的内存可以使程序变快,但是有时却不然。在实际中,如果给程序分配了它不能适应的过多内存,就会严重地影响程序速度。   ● 设置AutoRedraw为False   为了节省内存的使用,请将AutoRedraw设置为False。如果设置为True,对于复杂的绘图操作时,刷新屏幕的速度将很快。   ● 设置ClipControls为False   ● 使用Moveto组件替代设置Left和Top属性   ● 隐藏正在修改的控件   当需要修改一系列空间的外观属性值时,请先将此控件执行隐藏操作。完成修改工作后,再使之变为可见。   ● 使用临时变量引用多次使用的复杂表达式   比如,需要设置对象SelectedEmployee.NextOfKin.HomeInformation.Address几个属性的数值,请不要多次引用这个长长的表达式,请使用:    Dim addr As AddressInfo        Set addr = SelectedEmployee.NextOfKin.HomeInformation.Address
            addr.Street = txtStreet.Text
            addr.City = txtCity.Text
            addr.State = txtState.Text
            addr.Phone = txtPhone.Text   ● 缓存多次使用的属性值   如果程序需要多次引用txtLastName.Left的值,请将数值保存在变量中,然后引用这个变量。变量的存取要比属性值的存取在速度上快很多。   ● 使用Line (x1, y1)-(x2, y2), , B来绘制一个box,而不要画4次。   ● 尽可能地使用Image控件替代PictureBoxes    Image控件消耗较少的内存。   ● 使用Frame控件包容其他控件,不要使用PictureBoxes控件做同等工作。前者消耗内存较少。   ● 使用控件数组   对于不很重要的控件,请使用控件数组来引用它们。比如,许多表单都包含许多label,请将它们都放入一个控件数组中。一个包含10个控件的控件数组要比10个单独的控件占用更少的内存。   ● 使用定时器在后台执行长时间、低级别的运算工作。   ● 使用注释,并命名富有含义的变量。   详细的注释、富有含义的变量名以及空白行,不会增加编译程序的长度,反而能大大地提高程序的可读性。   ● 消除掉不使用的变量和代码,因为保留它们将消耗内存。   ● 使用DoEvents语句   使用DoEvents语句从而运行运行在长时间的进程时可以让用户执行其他的操作。
      

  2.   

    建议楼主先将代码格式优化一下吧!
    天狼工作室
    http://www.j2soft.cn/
      

  3.   

    For ii = 0 To Form9.List1.ListCount - 1
        Str = Form9.List1.List(ii)
        sz = Split(Str, ",")
        st = sz(0)
        Form9.List1.ListIndex = ii
        si(0) = st Mod 10
        si(1) = (st \ 10) Mod 10
        si(2) = (st \ 100) Mod 10
        si(3) = IIf(si(0) >= si(1), IIf(si(0) >= si(2), si(0), si(2)), IIf(si(1) >= si(2), si(1), si(2)))
        si(4) = IIf(si(0) <= si(1), IIf(si(0) <= si(2), si(0), si(2)), IIf(si(1) <= si(2), si(1), si(2)))
        si(5) = (si(0) Mod 2) + (si(1) Mod 2) + (si(2) Mod 2)
        si(6) = IIf(si(0) >= 5, 1, 0) + IIf(si(1) >= 5, 1, 0) + IIf(si(2) >= 5, 1, 0)
        If Form9.Check1(0).Value = 1 Then mi(0) = si(1)
        If Form9.Check1(1).Value = 1 Then mi(1) = si(5)
        If Form9.Check1(2).Value = 1 Then mi(2) = si(0)
        If Form9.Check1(3).Value = 1 Then mi(3) = si(4)
        If Form9.Check1(4).Value = 1 Then mi(4) = si(2)
        If Form9.Check1(5).Value = 1 Then mi(5) = si(3)
        If Form9.Check1(6).Value = 1 Then mi(6) = si(6)
    NextFor ii = 0 To Form9.List1.ListCount - 1
        For i = MSFlexGrid1.Rows - 1 To 1 Step -1
            bb = MSFlexGrid1.TextMatrix(i, 1)
            sii(0) = bb Mod 10
            sii(1) = (bb \ 10) Mod 10
            sii(2) = (bb \ 100) Mod 10
            sii(3) = IIf(si(0) >= si(1), IIf(si(0) >= si(2), si(0), si(2)), IIf(si(1) >= si(2), si(1), si(2)))
            sii(4) = IIf(si(0) <= si(1), IIf(si(0) <= si(2), si(0), si(2)), IIf(si(1) <= si(2), si(1), si(2)))
            ww(10) = (si(0) Mod 2) + (si(1) Mod 2) + (si(2) Mod 2)
            ww(11) = IIf(si(0) >= 5, 1, 0) + IIf(si(1) >= 5, 1, 0) + IIf(si(2) >= 5, 1, 0)
            ww(0) = fq(bb)
            ww(2) = fq(bb) - (ww(3) - fq(bb))
            ww(1) = fw(bb)
            ww(3) = si(0) + si(1) + si(2)
            ww(4) = si(3) - si(4)
            ww(5) = ww(3) - si(3) - si(4)
            ww(6) = si(3) + ww(5) - si(4)
            
            
            If Form9.Option1(2) = True And Form9.Option2(1) = True Then
                fff = False
                For dd = 0 To 6
                    For j = dd + 1 To 6
                    
                        For n = j + 1 To 6
                            If Form9.Check1(dd).Value = 1 And Form9.Check1(j).Value = 1 And Form9.Check1(n).Value = 1 Then
                                d = ww(dd) <> mi(dd)
                                c = ww(j) <> mi(j)
                                k = ww(n) <> mi(n)
                                b = Not (d Or c Or k)
                                
                                If b And Form9.Check1(dd).Value Then fff = True
                            End If
                        Next
                    Next
                Next
                
                If fff = False Then
                    MSFlexGrid1.RemoveItem i
                End If
            End If
        Next
    Next
      

  4.   

    我觉得
    sii(3) = IIf(si(0) >= si(1), IIf(si(0) >= si(2), si(0), si(2)), IIf(si(1) >= si(2), si(1), si(2))) 
    sii(4) = IIf(si(0) <= si(1), IIf(si(0) <= si(2), si(0), si(2)), IIf(si(1) <= si(2), si(1), si(2))) 
    这两句是关键所在,主要把这两句分解开做一下试试吧