令人惊讶的嵌套循环持续时间

我有我的VBA代码中的内部和外部循环。 我认为总的执行时间可以估计为外循环计数*内循环计数,但似乎并不是这样,执行10 * 10 ^ 8操作需要大约5秒钟,而执行10 ^ 8 * 10次​​操作大约需要24秒。 看起来外循环的许多重复使得总执行时间比内循环的许多重复时间更长,尽pipe在两个例子中操作的总数保持相同。 它应该这样工作吗? 这是为什么? 难道我做错了什么?

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 | +-------------------+-----------------+-----------------+----------+ 

以内部循环中的重复数字开始并在外部循环中重复一次的结果数据集如下所示:

 +---+---+---+----------+ | 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 

顺便说一句,我怎么做表格格式?

是的,这是有道理的。 循环边界总是在循环的开始处计算。 所以如果你运行十亿次内循环,那么你计算10 ^ maxI一次,然后10 ^ maxJ一次,然后十亿次重复j = j + 1.如果你运行外循环十亿次,一次做10 ^ maxI10 ^ maxJj = j + 1十亿次。