繁体   English   中英

内部/外部循环中的变量声明

[英]variable declaration inside/outside loop

如果由于某种原因我不得不使用尽可能少的内存空间,那么第二个代码比第一个代码好吗? (该代码仅供参考,没有任何意义)。 (编辑:想象一下,我想在由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
}

我确定的是:

在每种情况下,差异都不可见。 如果要进行如此小的优化,那么Java当然不是最好的技术。 这使我推荐第一个,因为它使代码更具可读性和逻辑性。 (如果仅在变量内部使用for,则在变量外部声明变量会很奇怪,这很令人困惑)。


我的想法:

在您的小示例中,并且您一直在寻找内存占用空间。 第一个更好,因为它遵循此注释中提到的隐式规则:范围越小越好。

在第一种情况下,变量k仅在很小的循环中使用。 因此,优化器将很容易理解它,并且仅使用寄存器,因此不占用内存,指令也更少。

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

如本评论中所述 ,它主要取决于您的使用方式。 在您的示例中,优化器将在两种情况下都检测到相同的用法,并且不使用任何内存。 但是在更难的代码中,它不会总是找到它。 所以我建议有较小范围的可能。

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

实际上关于可读性的进/出最佳实践的类似话题实际上还在这里进行了另一次讨论,从而产生了一些基准和讨论,其中一位参与者在此处进行了记录

作为一般经验法则,第二种选择在几乎所有情况下都将对内存和性能更好-在前一种情况下,前一种可能更具自文档性和可维护性,并避免在外部范围的其他地方意外使用。

由于您提到帖子中的代码仅是一个代表性的示例,因此它不仅可以应用于简单类型,还可以应用于更多类型:

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

从您提供的这些简短示例中,第二个选项。 但是,它始终取决于代码的逻辑。 考虑性能并最大程度地减少执行空间和时间,第二个代码可扩展性更好,即使它看起来与某些良好的编码实践相反。 代码中的K仅在循环块内使用。 但是,它在多个“块迭代”中被“重用”。 看一下for循环的语法,它在语句的开头声明iint i ); 此声明只会发生一次。 同样,多次声明该变量可能会浪费时间和内存。 在一般的简单情况下,JVM优化器可能会做得很好。 但是,它可能无法捕获代码(Java)的语义。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM