2017-04-03 56 views
2

在一個界面我有以下幾點:一個循環中的相同的計算在一個恆定

public static byte[] and0xFFArray(byte[] array) { 
    for (int i = 0; i < array.length; i++) { 
     array[i] = (byte) (array[i] & 0xFF); 
    } 
    return array; 
} 

在另一類我打電話以下幾點:

while(true){ 
    ... 
    if (isBeforeTerminator(htmlInput, ParserI.and0xFFArray("포토".getBytes("UTF-8")), '<')) { 
     ... 
    } 
    ... 
} 

我的問題是,將在編譯期間計算一次String常量的結果數組,還是每次循環迭代時計算它?

編輯:我只是注意到,該方法沒有意義,但它不影響問題。

+1

該方法的要點是什麼。它什麼都不做。 'byte'被轉換爲'int',被掩碼爲'0xFF',被轉換回'byte',將導致完全相同的值。 – Andreas

+2

在正常執行下,它會每次執行。但是JIT編譯器可能能夠優化它。 – shmosel

+0

優秀的問題的方式。 – EJoshuaS

回答

2

我假設你指的是

ParserI.and0xFFArray("포토".getBytes("UTF-8")) 

結果除非你明確緩存/存儲結果的地方,它會被計算每次調用它。

你可能要考慮是這樣的:

byte[] parserI = ParserI.and0xFFArray("포토".getBytes("UTF-8")); 

while (true) { 
    ... 
    if (isBeforeTerminator(htmlInput, parserI, '<')) 
    ... 

要理解爲什麼編譯器不會自動實現這一點,請記住,你不能寫一般的算法來檢測一個特定的方法將總是返回相同的值,因爲你會很快遇到像Halting Problem這樣的東西,所以你試圖寫的東西做這樣的事情將會非常複雜,甚至不會很好地工作。爲了制定合理的緩存策略,您還必須瞭解有關何時調用方法的相當數量。例如,在for循環後值得堅持緩存嗎?你必須瞭解有關程序結構的相當數量才能確定知道。

它是可能優化程序可以在某些有限情況下識別方法的結果是恆定的(我不確定Java優化程序實際實現的程度),但是您肯定可以'不要指望在一般情況下。要知道這是否是其中之一,唯一的方法是查看編譯器生成的實際字節碼,但我很懷疑它是如你所願的那樣聰明,因爲我上面列出的原因。如上所示,明確自行緩存會更好。