在循环之前或循环中声明变量之间的区别?

我一直想知道,一般情况下,在循环之前是否声明一个抛出变量,而不是在循环内部重复,是否会产生任何(性能)​​差异? Java中的一个(完全没有意义的)例子:

a)循环前声明:

double intermediateResult;
for(int i=0; i < 1000; i++){
    intermediateResult = i;
    System.out.println(intermediateResult);
}

b)循环内声明(重复):

for(int i=0; i < 1000; i++){
    double intermediateResult = i;
    System.out.println(intermediateResult);
}

哪一个更好, ab

我怀疑重复的变量声明(例子b )在理论上造成了更多的开销,但编译器足够聪明以至于无关紧要。 示例b具有更紧凑的优点,并将变量的范围限制在其使用位置。 尽管如此,我倾向于根据示例编码。

编辑:我特别感兴趣的Java案例。


哪个更好, ab

从性能角度来看,你必须测量它。 (在我看来,如果你可以测量一个区别,编译器不是很好)。

从维护的角度来看, b更好。 在尽可能最窄的范围内声明和初始化变量。 不要在声明和初始化之间留下空隙,也不要污染你不需要的命名空间。


那么我运行你的A和B例子每次20次,循环1亿次(JVM - 1.5.0)

答:平均执行时间:.074秒

B:平均执行时间:.067秒

令我惊讶的是B稍微快了一点。 与计算机一样快,现在很难说如果你能够准确地衡量这一点。 我会以A方式编码它,但我会说它并不重要。


这取决于语言和确切的用途。 例如,在C#1中,它没有任何区别。 在C#2中,如果局部变量被匿名方法(或C#3中的lambda表达式)捕获,它可能会产生非常显着的差异。

例:

using System;
using System.Collections.Generic;

class Test
{
    static void Main()
    {
        List<Action> actions = new List<Action>();

        int outer;
        for (int i=0; i < 10; i++)
        {
            outer = i;
            int inner = i;
            actions.Add(() => Console.WriteLine("Inner={0}, Outer={1}", inner, outer));
        }

        foreach (Action action in actions)
        {
            action();
        }
    }
}

输出:

Inner=0, Outer=9
Inner=1, Outer=9
Inner=2, Outer=9
Inner=3, Outer=9
Inner=4, Outer=9
Inner=5, Outer=9
Inner=6, Outer=9
Inner=7, Outer=9
Inner=8, Outer=9
Inner=9, Outer=9

所不同的是,所有的动作都捕获相同的outer变量,但每个动作都有自己独立的inner变量。

链接地址: http://www.djcxy.com/p/29801.html

上一篇: Difference between declaring variables before or in loop?

下一篇: Is there any overhead to declaring a variable within a loop? (C++)