2014-10-08 79 views
2

我在我的VBA代碼中有一個內部和外部循環。我認爲總的執行時間可以估算爲外循環計數*內循環計數,但似乎並非如此,因爲執行10 * 10^8操作需要大約5秒,但執行10^8 * 10次​​操作大約需要24秒。看起來外循環的許多重複使得總執行時間與內循環的許多重複相比更長,儘管在兩個示例中操作的總計數保持相同。它應該像這樣工作嗎?這是爲什麼?難道我做錯了什麼?令人驚訝的嵌套循環持續時間

Sub test() 
Dim i As Long 
Dim j As Long 
Dim t As Single 

maxI = 0 '1 
maxJ = 9 '1 bilion 

Do While maxJ >= 0 

    t = Timer 
    For i = 1 To 10^maxI 
    For j = 1 To 10^maxJ 
    Next j 
    Next i 

    Debug.Print maxI + maxJ & " " & maxI & " " & maxJ & " " & Timer - t 

    maxI = maxI + 1 
    maxJ = maxJ - 1 
Loop 

End Sub 

開始與所述外環bilion重複和在內層一個一次重複得到的數據集是這樣的:

+-------------------+-----------------+-----------------+----------+ 
| total_operations | outer_loop_cnt | inner_loop_cnt | time | 
+-------------------+-----------------+-----------------+----------+ 
|    9 |    9 |    0 | 222,2305 | 
|    9 |    8 |    1 | 24,52734 | 
|    9 |    7 |    2 | 8,300781 | 
|    9 |    6 |    3 | 5,683594 | 
|    9 |    5 |    4 | 5,070313 | 
|    9 |    4 |    5 | 5,109375 | 
|    9 |    3 |    6 | 5,167969 | 
|    9 |    2 |    7 | 4,933594 | 
|    9 |    1 |    8 | 4,898438 | 
|    9 |    0 |    9 | 5,109375 | 
+-------------------+-----------------+-----------------+----------+ 

將所得的數據集開始在內部循環bilion重複和一個重複在外層一個看起來像這樣:

+---+---+---+----------+ 
| 9 | 0 | 9 | 4,800781 | 
| 9 | 1 | 8 | 4,890625 | 
| 9 | 2 | 7 | 4,808594 | 
| 9 | 3 | 6 | 4,800781 | 
| 9 | 4 | 5 | 4,757813 | 
| 9 | 5 | 4 | 4,972656 | 
| 9 | 6 | 3 | 5,308594 | 
| 9 | 7 | 2 | 6,980469 | 
| 9 | 8 | 1 | 24,54297 | 
| 9 | 9 | 0 | 222,3828 | 
+---+---+---+----------+ 

更新:如果我改變的代碼,從而使上界不與這樣每次循環計算:

Do While maxJ >= 0 

    upper_i = 10^maxI 
    upper_j = 10^maxJ 
    t = Timer 
    For i = 1 To upper_i 
    For j = 1 To upper_j 
    ... 

對於更大的外部循環,我獲得了更好的結果。但它似乎仍然是事實,最好有幾乎相同數量的內外循環運行以獲得最佳性能。對我而言,這仍然令人驚訝。有任何想法嗎?

9 9 0 60,07031 
9 8 1 14,8125 
9 7 2 10,36719 
9 6 3 9,414063 
9 5 4 9,507813 
9 4 5 9,40625 
9 3 6 9,523438 
9 2 7 9,835938 
9 1 8 12,875 
9 0 9 11,02344 

9 0 9 9,75 
9 1 8 9,257813 
9 2 7 9,265625 
9 3 6 9,273438 
9 4 5 9,1875 
9 5 4 9,164063 
9 6 3 9,21875 
9 7 2 10,42969 
9 8 1 14,96094 
9 9 0 59,66406 

順便說一句,我該怎麼做表格格式?

+0

什麼數據類型是'maxI','maxJ','upper_i'和'upper_j'?他們都很渴望嗎? – Degustaf 2014-10-08 19:01:52

+0

我已經明確鍵入所有這些屬性爲Long,但它沒有顯着差異。 – 2014-10-08 20:09:32

回答

2

是的,這是有道理的。 For循環邊界始終在循環開始時計算。所以如果你運行內循環十億次,你計算一次10^maxI,然後10^maxJ一次,然後十億次重複j = j + 1.如果你運行外循環十億次,你做10^maxI一次,10^maxJj = j + 1一個十億倍。

+1

這也是我的解釋。在如此高的重複率下計算變得昂貴。檢查是否是這種情況的好方法是預先計算10^Max並將其設置爲for循環值。 – Compass 2014-10-08 16:28:10