我在我的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
順便說一句,我該怎麼做表格格式?
什麼數據類型是'maxI','maxJ','upper_i'和'upper_j'?他們都很渴望嗎? – Degustaf 2014-10-08 19:01:52
我已經明確鍵入所有這些屬性爲Long,但它沒有顯着差異。 – 2014-10-08 20:09:32