我一直想知道,一般来说,在循环之前声明一个抛弃变量,而不是在循环内部重复,是否会产生任何(性能)差异?Java中的一个(毫无意义的)示例:
a)循环前的声明:
double intermediateResult;
for(int i=0; i < 1000; i++){
intermediateResult = i;
System.out.println(intermediateResult);
}
Run Code Online (Sandbox Code Playgroud)
b)声明(重复)内循环:
for(int i=0; i < 1000; i++){
double intermediateResult = i;
System.out.println(intermediateResult);
}
Run Code Online (Sandbox Code Playgroud)
哪一个更好,一个还是b?
我怀疑重复变量声明(例子b)在理论上会产生更多的开销,但是编译器足够聪明,所以它并不重要.实施例b具有更紧凑的优点,并且将变量的范围限制在其使用的位置.尽管如此,我倾向于根据示例来编码一个.
编辑:我对Java案件特别感兴趣.
当我检查这个问题时,我不相信它,所以我测试了,似乎是真的.内部循环中的声明似乎比声明外部循环更快.有人可以解释为什么会这样吗?
这是我的测试代码:
public class CycleTest {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
long iterations = 1000000;
warmUp(iterations);
System.out.println("Cycle1");
double individualTime = getAverageTimePerIterationc1(iterations);
iterations = 1000;
double totalTime = getTotalTimec1(iterations);
System.out.println("ns/iteration: " + individualTime);
System.out.println("Total time for " + iterations + " runs: " + totalTime);
System.out.println("Cycle2");
iterations = 1000000;
double individualTime1 = getAverageTimePerIterationc2(iterations);
iterations = 1000;
double totalTime1 = getTotalTimec2(iterations);
System.out.println("ns/iteration: " + individualTime1);
System.out.println("Total time for " + …Run Code Online (Sandbox Code Playgroud) 让我们看一下这个例子:
String var;
while (...) {
var = ...
// do stuff
}
Run Code Online (Sandbox Code Playgroud)
在本例中,我们创建对对象的引用String,并在循环的每次迭代中为其分配不同的对象。
现在,在另一个例子中:
while (...) {
String var = ...
// do stuff
}
Run Code Online (Sandbox Code Playgroud)
如果我们假设编译器很幼稚,它只会在每次迭代时String分配对堆栈上对象的引用。
或者会吗?这就是我的问题 - (a?) Java 编译器是否执行此优化?我总是将对象声明保留在尽可能广泛的范围内,因为我担心这一点,但如果编译器已经这样做了,那么我的鞋子上就少了一颗鹅卵石。
先感谢您!