Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/391.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
编译器中临时变量的Java优化_Java_Optimization - Fatal编程技术网

编译器中临时变量的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())
无需显式测试是否等于true
true==true
。两种情况下使用的存储量和指令数很可能相同
textChanged
实际上永远不会“存储在内存中”。您的代码可能会由编译器进行优化,但您不应该过早地进行优化-关注可读性。另外
if(fachChanged | | cr.isLast())
无需显式测试是否等于true
true==true
。两种情况下使用的存储量和指令数很可能相同<代码>文本更改
将永远不会真正“存储在内存中”。