簡體   English   中英

for 循環的“計數限制”表達式是只計算一次,還是每次迭代?

[英]Will the "count limit" expression of a for-loop be evaluated only once, or on each iteration?

如果我在循環的條件語句中調用一個方法,它會在每次循環迭代中被調用嗎?

例如:

for( int i = 0; i <= expensiveComputation(); i++ ) {
    // Do something.
}

我會在每次迭代中執行expensiveComputation()嗎? 還是會在初始化循環變量的同時在每次迭代中存儲和使用expensiveComputation()的結果?

我應該改寫它嗎:

int max = expensiveComputation();
for ( int i = 0; i <= max; i++ ) {
    // Do something.
}

它將在每次迭代時被調用,除非編譯器/優化器決定它沒有副作用並且可以消除調用作為優化。

我的意思是,編譯器不能只是盲目地存儲值,因為 java 中的函數與數學函數不同,它不僅可以有返回值,還可以有諸如將某些內容打印到某些流或更改某些全局狀態等副作用。

編譯器每次迭代都不能省略調用還有另一個原因。 您的函數不接受任何參數這一事實並不意味着它每次都必然返回相同的值。 例如,它可以從流中輸入一個數字並返回它,或者它可以隨機生成一個數字。

所以編譯器需要非常小心,才能安全地消除調用。 所以,如果函數很昂貴,你絕對應該預先存儲它的值。

如果不需要在每次迭代時計算計算,則第二個選項更好


如果你假設你的循環長度為 n 並且你的計算是 O(n)。
對於第一個解決方案,復雜度為O(n 2 )而另一個為O(2n)

它可能會或可能不會在每次迭代時被調用,這取決於編譯器想要發出的字節碼。 很可能實際上每次都會調用它。

如果要確保在每次迭代時都不會調用它,請使用int max = ...版本。

為什么不簡單地自己測試一下?

是的,您應該在這些情況下緩存您的結果,以確保更好的性能。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM