Java 多次声明变量是否会降低执行速度?

Java 多次声明变量是否会降低执行速度?,java,Java,在这三种来源之间,在效率方面是否存在差异 for (int i=0; i<N; i++) int j = whatever(); for(int i=0;i在第一个示例中,变量将被初始化N次 基本上,这三个示例之间没有显著差异。这取决于您是否需要在更大范围内使用j变量。这是主要区别。声明变量会影响编译时,而不是运行时。局部变量将在堆栈上占用的空间是在编译时分配的,因此请运行-时间不会受到影响 受影响的是可读性:一般来说,最好在使用变量的位置附近声明变量,并将它们保持在程序允许的范

在这三种来源之间,在效率方面是否存在差异

for (int i=0; i<N; i++)
    int j = whatever();

for(int i=0;i在第一个示例中,变量将被初始化
N次


基本上,这三个示例之间没有显著差异。这取决于您是否需要在更大范围内使用
j
变量。这是主要区别。

声明变量会影响编译时,而不是运行时。局部变量将在堆栈上占用的空间是在编译时分配的,因此请运行-时间不会受到影响

受影响的是可读性:一般来说,最好在使用变量的位置附近声明变量,并将它们保持在程序允许的范围内。从这个意义上讲,第一个代码段是最好的


使用代码段2或3的唯一原因是,在循环完成后需要变量
i
j
的值,例如,找出执行
break
语句的时间。无法从示例中判断是否是这种情况。

声明变量对per没有影响一旦代码被编译,JIT就足够聪明,可以预先分配局部变量

从技术上讲,限制变量的范围可以提高性能,因为它不必在不再需要变量后保留该变量,但我怀疑JIT足够聪明,可以解决这个问题。

如文所述?不

是否存在区分重要的情况?是的

那些编译器无论如何都不能为您处理的情况是否经常出现?不


在这两种情况下,目前最好的办法是测试它。回答(和帮助)“为什么这个运行得比那个慢”要容易得多

这三个示例在效率方面没有区别。但是根据编码标准,您应该在只需要时声明变量。另外,变量的可视性方面也有区别。让我解释一下

选项1

 for (int i=0; i<N; i++)
int j = whatever();

用于(int i=0;i它们实际上都是一样的。它们之间唯一的区别是,在第二个示例中,一个变量的作用域在循环之外,而在第二个示例中,两个变量的作用域都在循环之外。在第一个示例中,两个变量都不能在循环之外访问,这通常会使在循环中处理变量的方法,除非有理由可以在循环之外访问变量

int x = 0;

只需要JVM将原始32位值0分配给与
x
关联的内存中的位置。但是,在这种情况下使用自动装箱会很有趣,因为
整数x=0
需要JVM实例化一个新对象,该对象具有更多的资源需求。

否。您需要理解代码是c编译为字节码,然后在Java虚拟机(JVM)上运行,Java虚拟机将字节码转换为机器代码,并实时(JIT)进行优化

许多简单的事情,比如多变量声明,要么在字节码编译过程中,要么在JIT过程中进行优化


我希望我能把你链接到一篇关于这方面的好文章上,但我没有想到。

一旦编译器对代码进行了优化,就应该没有什么区别了

如果您在调试模式下运行,默认情况下优化处于关闭状态, 如果在循环范围内声明变量,则效率低于在循环范围外声明变量

在这种情况下,对于循环的每一次迭代,代码都会在堆栈上为变量创建空间,迭代后它将被丢弃。这有点低效

但是对于循环变量(i),在for循环之前或内部声明它并不重要,因为它只在堆栈上分配一次

因此,在调试模式下,2和3的性能都优于1。
在发布模式下,所有3个都将是相同的。

除非您执行此代码片段数百万次,否则答案是选择可读性最强的源代码(因此也是可维护性最强的源代码)


即使上述技术之一的速度明显更快,但大多数代码(超过90%)不会经常执行,因此其速度与您的总体程序性能无关。请专注于编写可读、可理解和可维护的代码。然后您可以优化10%(或更少)的代码确实会造成性能瓶颈的代码。

对其进行基准测试!但也不要进行微优化!使用可读性最高的代码。我认为不应该有任何区别;编译器应该能够判断出它们都做了完全相同的事情。有可能第一个代码的效率比第二个稍高。@Ho为什么?我认为在循环中有一个额外的声明可能会使它稍微慢一点,但前提是Java编译器没有发现它。我敢打赌字节码没有区别。这很奇怪,所以你说第二个可能比第一个示例慢一点。(显然,考虑到它们在大多数情况下是相同的)是的,限制范围(可能)使堆栈帧所需的总空间量最小化。效果最好是很小(最坏?),但可以测量(特别是如果您在单个方法中重复了几十次该场景)@Beppi是的,如果JIT未能检测到循环后不需要
i
j
,那么您可能会使用更多的变量、寄存器等,这可能会影响性能或使某些优化更加困难。@PeterLawrey-优化JITC几乎肯定会检测到没有使用VAR。我不是不过,我对javac不太了解,所以影响主要在解释器上,再加上一些primiti
 for (int i=0; i<N; i++)
int j = whatever();
int j;
for (int i=0; i<N; i++)
    j = whatever();
int i, j;
for (i=0; i<N; i++)
    j = whatever();
int x = 0;