概述
在設置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
的起止值設爲公式,因爲這並不比特地定義一個變量來存放要慢。