VBA中For的結束值在不同賦值方式下的耗時

概述

在設置For的開始和結束值時,往往會使用公式,即需要計算才能得到值。但For會不會每次循環都計算一次結束值呢,那豈不是很浪費時間?這就需要來測試一下。

測試速度的代碼

Private Declare Function QueryPerformanceCounter Lib "KERNEL32" (lpPerformanceCount As Currency) As Long
Private Declare Function QueryPerformanceFrequency Lib "KERNEL32" (lpFrequency As Currency) As Long

Private m_Frequency   As Currency
Private m_Start       As Currency
Private m_Now         As Currency
Private m_Available   As Boolean

Sub TestSpeet()

m_Available = (QueryPerformanceFrequency(m_Frequency) <> 0)
If Not m_Available Then
Debug.Print "Performance Counter not available"
End If

Dim i As Long
Dim a(1000) As Long, b As Long, c(1) As Long

QueryPerformanceCounter m_Start

For i = 1 To 1000000 Step 1
    ' 下面的代碼塊中選一個執行
    ' --------------- 循環時求值 ---------------
    For j = 1 To UBound(a) Step 1
    Next j
    ' --------------- 循環前求值 ---------------
    b = UBound(a)
    For j = 1 To b Step 1
    Next j
    ' --------------- 常數 ---------------
    For j = 1 To 1000 Step 1
    Next j
Next i

QueryPerformanceCounter m_Now

Elapsed = 1000 * (m_Now - m_Start) / m_Frequency
Debug.Print Format(Elapsed, "#.0000")
End Sub

測試結果

測試結果的時間單位是毫秒。

測試順序 循環時求值 循環前求值 常數
1 360.2659 360.0748 359.8621
2 360.0173 360.4622 360.0325
3 360.0655 359.9629 359.6281
4 359.8392 359.9041 359.7904
5 360.2690 360.3178 360.0977
6 360.2365 360.2665 359.7168
7 360.1620 359.8445 360.4467
8 360.1632 360.2971 360.3351
9 360.1063 359.9023 360.1060
10 359.7458 360.6394 365.0117

結論

所以可以盡情把For的起止值設爲公式,因爲這並不比特地定義一個變量來存放要慢。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章