在循环之前或循环中声明变量之间的区别?
我一直想知道,一般情况下,在循环之前是否声明一个抛出变量,而不是在循环内部重复,是否会产生任何(性能)差异? 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);
}
哪一个更好, a或b ?
我怀疑重复的变量声明(例子b )在理论上造成了更多的开销,但编译器足够聪明以至于无关紧要。 示例b具有更紧凑的优点,并将变量的范围限制在其使用位置。 尽管如此,我倾向于根据示例的编码。
编辑:我特别感兴趣的Java案例。
哪个更好, a或b ?
从性能角度来看,你必须测量它。 (在我看来,如果你可以测量一个区别,编译器不是很好)。
从维护的角度来看, 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
变量。
上一篇: Difference between declaring variables before or in loop?
下一篇: Is there any overhead to declaring a variable within a loop? (C++)