来自编译器的临时变量的Java优化

时间:2014-02-21 18:29:01

标签: java optimization

在我的程序中,我有一个很长的if condition,看起来像这样:

if((items.size() > 0 && !k.getText().equals(last)) || cr.isLast() == true)

现在我认为如果我在第一个语句中使用变量就更容易阅读,所以我将代码更改为:

boolean textChanged = items.size() > 0 && !k.getText().equals(last);
if(fachChanged == true || cr.isLast() == true)

现在我的问题是:第二个代码是否需要更多内存,因为我使用了一个临时变量,或者这是从编译器优化的?我认为今天如果一个布尔值少于或多于存储在内存中但是希望创建一个优化且对内存友好的程序,那就不那么重要了。

4 个答案:

答案 0 :(得分:4)

“程序优化的第一条规则:不要这样做。程序优化的第二条规则(仅限专家!):不要这样做。” - Michael A. Jackson

编译器将优化可以优化的内容,您应该关心更困难的任务:尝试编写干净且可读的代码。

答案 1 :(得分:1)

if((items.size() > 0 && !k.getText().equals(last)) || cr.isLast() == true)

编译器将其解析为布尔值,boolean必须到达某处。 if语句完成后,boolean将被处理掉。如果你创建一个局部变量,那么boolean在内存中会维持它的生命周期(这里看起来好像直到方法结束)。

也就是说,编译器可能会注意到这一点,并且如果布尔值没有在其他任何地方使用,它可能会评估你的第一个例子。无论哪种方式,这都是一个非常严格的优化,并且Java可以肯定地处理这两种方式。

答案 2 :(得分:1)

使用您提取的解决方案 - 它更具可读性,您可以正确调试它,并且编译器无论如何都会优化它。此外,只有本地范围的变量(以及最重要的布尔基元)不会存储在堆上,因此无论如何都会快速处理。

答案 3 :(得分:1)

到目前为止,我100%同意所有其他答案,但我也不得不实际回答这个问题。

  

我的问题是:第二个代码是否需要更多内存,因为我使用了一个   临时变量

可能没有。最有可能的是,在这两种情况下,编译器都会将布尔值放在寄存器中,它根本不会打到内存中。这取决于您提供的代码周围发生的其他代码。

如果稍后引用该变量,则可能会耗尽寄存器,并且最终会出现在堆栈中。在任何一种情况下,它都不会进入堆中,因此你的内存配置文件将是相同的。