内部/外部循环变量声明

时间:2018-04-12 15:22:06

标签: java variables

如果由于某种原因我必须使用尽可能少的内存空间,那么第二个代码是否比第一个更好? (该代码仅用于说明,并没有任何意义)。 (编辑:想象一下我想在JVM完成任何优化之前制作汇编代码。然后我在第一个程序中使用99999998额外的内存位置与第二个程序相比?焦点只是一个内存使用)

首先:

for(int i=0; i<99999999; i++){
    int k=2*i
}

第二:

int k=0;
for(int i=0; i<99999999; i++){
    k=2*i
}

3 个答案:

答案 0 :(得分:2)

我确信:

在每种情况下,差异都不可见。如果你想做这么小的优化,Java肯定不是最好的技术。这让我推荐第一个因为它使代码更具可读性和逻辑性。 (如果只在其中使用变量,那么在for之外声明一个变量很奇怪,这很令人困惑)。

我的想法:

在您的小例子中,因为您正在寻找内存占用。第一个更好,因为它遵循此comment中提到的隐式规则:范围越小越好。

在第一种情况下,变量k仅用于非常小的循环。因此,优化器将很容易理解它并仅使用寄存器,因此没有内存使用和更少的指令。

在第二种情况下,优化器更难确定k不在其他地方使用。所以它可以允许一些内存而不是使用寄存器。然后它将使用一些内存并且不太优化,因为它需要加载和存储内存的指令。

正如本comment所提到的,它主要取决于你如何使用它。在您的示例中,优化程序将检测到它在两种情况下的相同用法并且将不使用内存。但是在更难的代码中,它并不总能找到它。所以我建议让更小的范围成为可能。

答案 1 :(得分:1)

@ pranay-khandelwal的回应链接到用另一种语言对这个问题的精彩讨论。但是,Java JVM会在运行时抛出字节码以试图获得更好的性能,这会使事情变得复杂。

实际上,对于可读性的进/出最佳做法 的类似主题进行了另一次讨论here,这导致了一些基准和讨论,其中一个参与者记录here

作为一般经验法则,在几乎所有情况下,第二种选择对记忆和表现都会更好 - 前者可能更自我记录和维护,并避免在外部范围内的其他地方意外使用。

既然你提到帖子中的代码只是一个代表性的例子,这可能不仅仅适用于简单的类型:

替换已注册的内存区域的内容比注册新内存区域和取消注册旧的(或等待它被垃圾回收)的成本更低。即使语言编译器或解释器巧妙地使用最近未引用的东西来存储新东西, 工作也需要工作,并且可以通过外部声明乐观地避免开销 - 尽管其他人提到,这通常是 一个不必要的,可能是错误产生的微优化。

答案 2 :(得分:-1)

从您提供的这些简短示例中,第二个选项。但是,它始终取决于代码的逻辑。 考虑到性能并最小化执行空间和时间,第二个代码可以更好地扩展,即使它看起来反对一些​​好的编码实践。 代码中的K仅在循环块内使用。然而,它被重复使用&#34;多次&#34;块迭代&#34;。看一下 for循环的语法,它在语句的开头声明 i int i );这个宣言只会发生一次。同样,将变量多次声明可能会导致浪费时间和内存。 JVM优化器可以在一般的简单情况下做得很好。但是,它可能无法捕获代码的语义(Java)。

for(int i=0,k=0; i<99999999; i++){
    k=2*i
}