2017-04-03 59 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优化程序实际实现的程度),但是您肯定可以'不要指望在一般情况下。要知道这是否是其中之一,唯一的方法是查看编译器生成的实际字节码,但我很怀疑它是如你所愿的那样聪明,因为我上面列出的原因。如上所示,明确自行缓存会更好。