未公開的返回?cái)?shù)組型函數(shù)加速秘訣

字號(hào):

在VB6中,函數(shù)是能夠返回?cái)?shù)組對(duì)象的。這種情況下,我們不能象返回對(duì)象或者數(shù)值的其他函數(shù)一樣使用函數(shù)名當(dāng)做局部變量來存儲(chǔ)中間結(jié)果,因此不得不生成一個(gè)臨時(shí)局部數(shù)組,函數(shù)退出前再分配這個(gè)數(shù)組給函數(shù)名,就象下面的代碼一樣:
    ' 返回一個(gè)數(shù)組,其中含有N個(gè)隨即元素
    ' 并且將平均值保存在AVG中
    Function GetRandomArray(ByVal n As Long, avg As Single) As Single()
    Dim i As Long, sum As Single
    ReDim res(1 To n) As Single
    ' 以隨機(jī)數(shù)填充數(shù)組,并計(jì)算總和
    Randomize Timer
    For i = 1 To n
    res(i) = Rnd
    sum = sum + res(i)
    Next
    ' 賦值結(jié)果數(shù)組,計(jì)算平均值
    GetRandomArray = res
    avg = sum / n
    End Function
    難以置信的是,只需要簡單地顛倒最后2條語句的順序,就能使上面這段程序變得快些:
    ' ... ' 賦值結(jié)果數(shù)組,計(jì)算平均值
    avg = sum / n
    GetRandomArray = res
    End Function
    例如,在一個(gè)Pentium II 333MHz 機(jī)器上,當(dāng)N=100,000時(shí),前段程序運(yùn)行時(shí)間為0.72秒,后段程序則為0.66秒,前后相差10%。
    原因何在呢?前段程序中,VB將拷貝res數(shù)組到GetRandomArray對(duì)應(yīng)的結(jié)果中,當(dāng)數(shù)組很大時(shí),花費(fèi)的時(shí)間是很長的。后段程序中,由于GetRandomArray = res是過程的最后一條語句,VB編譯器就能確認(rèn)res數(shù)組不會(huì)被再使用,因此將直接交換res和GetRandomArray的地址數(shù)值,從而節(jié)省了數(shù)組元素的物理拷貝操作以及隨后的res數(shù)組釋放操作。
    總結(jié)如下:當(dāng)編寫返回?cái)?shù)組的函數(shù)時(shí),一定要將分配臨時(shí)數(shù)組到函數(shù)名的語句放在最后,就是其后緊挨者Exit Function 或者End Function的位置。