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

