Java中的可变范围效率

Java中的可变范围效率,java,scope,Java,Scope,快速性能/记忆问题: 如果存在差异,还有什么更好 这个 intx; 对于(int i=0;i

快速性能/记忆问题:

如果存在差异,还有什么更好

这个

intx;
对于(int i=0;i<10000;i++)
{
x=i;
//做点什么
}
还是这个

for (int i = 0; i < 10000; i++)
{
 int x = i;
 //do something
}
for(int i=0;i<10000;i++)
{
int x=i;
//做点什么
}


我认为它们在组装方面是相同的(有时,只做一个大堆栈推送比一堆局部变量的推送要快)。在第二种情况下,即使它们都产生相同的字节码,它也会缩小x的范围。

我认为它们在汇编方面都是相同的(有时只做一个大堆栈推送比一堆局部变量的推送更快)。在第二种情况下,即使它们都产生相同的字节码,它也只会缩小x的范围。

完全相同。。。定义一个变量(原语/引用)只是计算它将存在的位置(作为堆栈指针的偏移量)。这是由编译器完成的。

完全相同。。。定义一个变量(原语/引用)只是计算它将存在的位置(作为堆栈指针的偏移量)。这是由编译器完成的。

您试过了吗?几乎可以肯定这没有什么区别。@CarlNorum:原语,当然。重量级物体?如果有差别的话,那就可以忽略不计了。所以我更喜欢第二个,它限制了x的范围。调整IO和算法。这样的微优化不会对性能产生任何重大影响,但是在代码可读性和健壮性方面会有一个问题。@Makoto如果你看一下我提供的链接的第二个答案,你会发现字节码是完全相同的-没有任何区别。效率上的任何可能的差异都是很小的,如果重要的话,你可能不应该首先使用Java。你试过了吗?几乎可以肯定这没有什么区别。@CarlNorum:原语,当然。重量级物体?如果有差别的话,那就可以忽略不计了。所以我更喜欢第二个,它限制了x的范围。调整IO和算法。这样的微优化不会对性能产生任何重大影响,但是在代码可读性和健壮性方面会有一个问题。@Makoto如果你看一下我提供的链接的第二个答案,你会发现字节码是完全相同的-没有任何区别。效率上的任何可能的差异都是很小的,如果重要的话,你可能不应该首先使用Java。它如何产生相同的字节码但限制了作用域?编译器很聪明-如果他们看到你在循环后不使用它,他们会为你限制作用域。@JasonSperske变量只是堆栈中的一个偏移量。它通过忘记循环外部存在的变量来限制范围。@JasonSperske在编译器中存在环境以及推送和弹出环境的概念。在循环内部存在绑定到堆栈偏移量“x”的内容。外部未知x,因为包含它的环境被弹出。它怎么能产生相同的字节码但限制作用域?编译器很聪明-如果他们看到你在循环后不使用它-他们会为你限制作用域。@JasonSperske变量只是堆栈中的一个偏移量。它通过忘记循环外部存在的变量来限制范围。@JasonSperske在编译器中存在环境以及推送和弹出环境的概念。在循环内部存在绑定到堆栈偏移量“x”的内容。在它之外,x是未知的,因为包含它的环境被弹出。
for (int i = 0; i < 10000; i++)
{
 int x = i;
 //do something
}