在做循环的时候
----------------------------------------------
'直接使用
A:
Dim array(10000) as varient
for i=0 to ubound(array)
    debug.print "000000000000000"
next
----------------------------------------------
'赋值再使用
B:
Dim array(10000) as varient
y=ubound(array)
for i=0 to y
    debug.print "000000000000000"
next
-------------数组很大的时候,A和B的效率居然会不一样,B的效率要高于A的效率,为什么???
在我看来,Ubound不关是A还是B,都只是执行了一次,作为定值来使用的。
请各位赐教!

解决方案 »

  1.   

    你把for语句,用while语句翻译一下,或者想一下C语言的for语句,这个问题就很明白了
    c语言中for的用法是
    for(i=0;i<ubound(array);i++){...}
      

  2.   

    其实,for语句就是每次都执行一遍ubound(array)的
      

  3.   

    谢谢楼上的讲解,开始,我也考虑到是这个问题。后来我干脆写了个function.function fncUbound(byval array as varient) as long
         fncUbound=ubound(array)'此行设置断点 
    end funciton把楼顶的代码修改为
    ----------------------------------------------
    '直接使用
    A:
    Dim array(10000) as varient
    for i=0 to fncUbound(array)
        debug.print "000000000000000"
    next
    ----------------------------------------------
    '赋值再使用
    B:
    Dim array(10000) as varient
    y=fncUbound(array)
    for i=0 to y
        debug.print "000000000000000"
    next
    -------------
    设置断点后,
    不论是A还是B,
    程序只进入一次断点。而没出现反复进入断点的情况。
    这该如何解释??
      

  4.   

    按楼主说的在我的机子上都测试了一下,情况如楼主所说两种算法都只调用一次Ubound,但并未出现效率差的问题,不知楼主说的数组很大的时候到底有多大?
      

  5.   

    啊!
    我现在的机器没有VB环境,写不了太详细。大概是这样的!
    ------------------------------------------
    Dim time1 as Date
    Dim time2 as Date
    Dim time3 as Date
    Dim time4 as Date
    Dim array(10000) as varienttime1=Now
    for i=0 to fncUbound(array)
        debug.print "000000000000000"
    next
    time2=Now
    time3=Now
    y=fncUbound(array)
    for i=0 to y
        debug.print "000000000000000"
    next
    time4=Now
    debug.print "case 1:" & (time2-time1)
    debug.print "case 2:" & (time4-time3)--------------------------------------
    结果相差有1秒!
      

  6.   

    从理论上说,不应该有什么差异
    for i=0 to y
    之后,y的值已被放入寄存器,执行循环和y比较的时候,都是直接从寄存器读取数据,也就是说在for i=0 to y这个循环中y只用到了一次,比较明显的例证是在循环体中改变y的值,并不会改变循环体执行的次数:
    Dim i As Long
    Dim j As Long
    j = 10
    For i = 1 To j
        j = 4*i
        Debug.Print "line " + CStr(j)
        
    Next
      

  7.   

    '我机器执行10000的结果,几乎没有差别   迅驰 1.6G 512M
    case 1:8.10185229056515E-05
    case 2:8.10185156296939E-05
      

  8.   

    这帖子先不结,等我上班去单位,把当时测试的代码复制上来。我的OS WIN2K,VB6,难道会跟CPU有关系?P43.0不过双核没打开。