2012-05-18 80 views
3

下面是兩個片段。注意程序之間的唯一區別在於一個break to return和另一個return立即。我知道在一個方法中有一個退出點是很好的設計實踐。但我並不擔心這裏的設計。如果我使用break支付額外費用,我會付多少額外的計算/內存/時鐘週期?打破vs從循環內返回

計劃之一:

public boolean doThis(String[] A){ 
    boolean indicator = false; 
    for(int i=0; i<A.length; i++){ 
     if(A[i].equals("Taboo")) 
     break; 
     for(int x=0; x<=i; x++) 
      //some work is done here. to make indicator true or false 
    } 
    return indicator; 
} 

方案二:

public boolean doThis(String[] A){ 
    boolean indicator = false; 
    for(int i=0; i<A.length; i++){ 
     if(A[i].equals("Taboo")) 
     return false; 
     for(int x=0; x<=i; x++) 
      //some work is done here. to make indicator true or false 
    } 
    return indicator; 
} 

回答

4

如果你的編譯器是什麼好,你付出一點點少了 「返回false」 的情況。

您可能會認爲「休息」很貴。用一個糟糕的編譯器,它是一個單一的跳轉指令,返回。如果你不介意擴展代碼,一個好的編譯器會意識到跳轉是超級的,並且可以將返回語句提升到休息點。

什麼使得「返回false」情況稍微便宜一些,是因爲「返回指示符」可能需要從存儲器中提取結果放入調用約定結果返回寄存器,這幾乎是編譯器普遍使用的結果。 「return false」將常量加載到寄存器中(特別是結果返回寄存器);這在現代機器上總是比從內存中獲取更快,因爲文字被嵌入指令流中,處理器已經獲取該指令流。

複雜的編譯器可能會將所有變量保留在寄存器中。在這種情況下,「返回指示符」實際上可能會更快,因爲智能編譯器可能會計劃將「指示符」放在結果返回寄存器中;沒有工作需要加載的價值。對於你用字符串調用編碼的程序,我懷疑編譯器會試圖保留寄存器中的所有變量;它只需要付出昂貴的代價就可以讓所有人都能夠平等地接受。

拋開所有這些細節,這不是你應該擔心的優化問題。

+0

我不想優化。我正在努力加深我的理解。 +1爲您解釋。 – kasavbere