【问题标题】:Variable scope efficiency in Java [duplicate]Java中的变量范围效率[重复]
【发布时间】:2013-02-23 10:14:05
【问题描述】:

一个快速的性能/内存问题:

如果有区别,什么更好?

这个

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

或者这个

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

?

【问题讨论】:

  • 你试过了吗?几乎可以肯定没有区别。
  • @CarlNorum:原语,当然。重量级物体?少这样。
  • 如果有差异,可以忽略不计。所以更喜欢第二种,它限制了x的范围。调整您的 IO 和算法。像这样的微优化不会对性能产生任何重大影响,但会对代码的可读性和健壮性产生影响。
  • @Makoto 如果您查看我提供的链接的第二个答案,您会发现字节码完全相同相同 - 没有任何区别。
  • 任何可能的效率差异都非常小,如果重要的话,您可能一开始就不应该使用 Java。

标签: java scope


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 如何产生相同的字节码但限制范围?
    • 编译器很聪明——如果他们看到你在循环之后没有使用它——他们会限制你的范围。
    • @JasonSperske 该变量只是堆栈中的一个偏移量。它通过忘记变量存在于循环之外来限制范围。
    • @JasonSperske 在编译器中存在环境以及推送和弹出环境的概念。在循环内部存在一些绑定到“x”堆栈偏移量的东西。在它之外 x 是未知的,因为包含它的环境已被弹出。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-14
    • 2020-08-14
    • 2013-09-27
    • 2015-08-20
    • 1970-01-01
    • 2023-03-06
    相关资源
    最近更新 更多