编译器中临时变量的Java优化
在我的程序中,我有一个长的编译器中临时变量的Java优化,java,optimization,Java,Optimization,在我的程序中,我有一个长的if条件,看起来像这样: if((items.size() > 0 && !k.getText().equals(last)) || cr.isLast() == true) 现在,我认为如果在第一条语句中使用变量,阅读起来会更容易,因此我将代码改为: boolean textChanged = items.size() > 0 && !k.getText().equals(last); if(fachChanged ==
if条件,看起来像这样:
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)
现在我的问题是:第二个代码需要更多的内存,是因为我使用了一个临时变量,还是从编译器优化的?我认为今天,如果在内存中存储一个布尔值或多个布尔值并不重要,但我们希望创建一个优化且内存友好的程序
if((items.size() > 0 && !k.getText().equals(last)) || cr.isLast() == true)
编译器将其解析为布尔值,boolean
。if语句完成后,布尔值
将被丢弃。如果您创建了一个局部变量,则该布尔值
将在其生命周期内保存在内存中(在这里,它看起来一直到方法结束)
这就是说,编译器可能会注意到这一点,如果布尔值不在其他任何地方使用,它可能会对您的第一个示例进行计算。无论哪种方式,这都是一个非常严格的优化,Java肯定可以以任何方式处理
编译器将其解析为布尔值,boolean
。if语句完成后,布尔值
将被丢弃。如果您创建了一个局部变量,则该布尔值
将在其生命周期内保存在内存中(在这里,它看起来一直到方法结束)
这就是说,编译器可能会注意到这一点,如果布尔值不在其他任何地方使用,它可能会对您的第一个示例进行计算。无论哪种方式,这都是一个非常严格的优化,Java肯定可以用任何方式处理。使用您提取的解决方案-它更具可读性,您可以正确地调试它,编译器也会对它进行优化。此外,只有局部范围的变量(最重要的是布尔基元)不会存储在堆上,因此无论如何都会被快速处理。使用提取的解决方案-它更具可读性,您可以正确地调试它,编译器也会对其进行优化。此外,只有局部作用域变量(最重要的是布尔基元)不会存储在堆上,因此无论如何都会被快速处理。“程序优化的第一条规则:不要这样做。程序优化的第二条规则(仅限专家!):现在不要这样做。”-Michael A.Jackson
编译器将优化可以优化的内容,您应该关心更困难的任务:尝试编写干净易读的代码。“程序优化的第一条规则:不要这样做。程序优化的第二条规则(仅限专家!):现在不要这样做。”-Michael A.Jackson
编译器将优化可以优化的内容,您应该关心更困难的任务:尝试编写干净易读的代码。到目前为止,我100%同意所有其他答案,但我也不得不实际回答这个问题
我的问题是:第二个代码是否需要更多内存,因为我使用了
临时变量
可能不会。在这两种情况下,编译器很可能会将布尔值放入寄存器中,而它根本不会命中内存。这取决于您提供的代码周围正在发生的其他代码
如果稍后引用该变量,则可能会耗尽寄存器,并最终导致它出现在堆栈上。在任何一种情况下,它都不会进入堆中,因此您的内存配置文件在任何一种情况下都是相同的。到目前为止,我100%同意所有其他答案,但我也不得不实际回答这个问题
我的问题是:第二个代码是否需要更多内存,因为我使用了
临时变量
可能不会。在这两种情况下,编译器很可能会将布尔值放入寄存器中,而它根本不会命中内存。这取决于您提供的代码周围正在发生的其他代码
如果稍后引用该变量,则可能会耗尽寄存器,并最终导致它出现在堆栈上。在任何一种情况下,它都不会进入堆中,因此您的内存配置文件在任何一种情况下都是相同的。您的代码可能会由编译器进行优化,但您不应该过早地进行优化-关注可读性。另外if(fachChanged | | cr.isLast())
无需显式测试是否等于truetrue==true
。两种情况下使用的存储量和指令数很可能相同textChanged
实际上永远不会“存储在内存中”。您的代码可能会由编译器进行优化,但您不应该过早地进行优化-关注可读性。另外if(fachChanged | | cr.isLast())
无需显式测试是否等于truetrue==true
。两种情况下使用的存储量和指令数很可能相同<代码>文本更改
将永远不会真正“存储在内存中”。