Java 哪个for循环头性能更好?

Java 哪个for循环头性能更好?,java,for-loop,compiler-optimization,Java,For Loop,Compiler Optimization,我在Android文档中看到了以下内容: int n = getCount(); for (int i = 0; i < n; i ++) { // do somthing } int n=getCount(); 对于(int i=0;i

我在Android文档中看到了以下内容:

int n = getCount();

for (int i = 0; i < n; i ++) {
    // do somthing
}
int n=getCount();
对于(int i=0;i
但我已经习惯于看到和做:

for (int i = 0; i < getCount(); i ++) {
    // do somthing
}
for(int i=0;i

我很好奇一个是否比另一个更有效率?在这两种情况下究竟发生了什么?当您以第二种方式调用
getCount()
时,计算机是否必须分配另一个变量?或者这仅仅是代码清洁度或偏好的问题?

这是JDK1.6.0_21的
javac
编译器为以下两种情况生成的结果:

第一种情况:

int n = getCount();

for (int i = 0; i < n; i ++) {
    // do something
}
for (int i = 0; i < getCount(); i ++) {
    // do something
}
第二种情况:

int n = getCount();

for (int i = 0; i < n; i ++) {
    // do something
}
for (int i = 0; i < getCount(); i ++) {
    // do something
}

结果代码可能不同,但根据
getCount()
,运行时可能会优化执行。一般来说,第一个代码似乎效率更高,尤其是当
getCount()
执行一些复杂的操作以返回其值时。

这是JDK1.6.0_21的
javac
编译器针对以下两种情况生成的:

第一种情况:

int n = getCount();

for (int i = 0; i < n; i ++) {
    // do something
}
for (int i = 0; i < getCount(); i ++) {
    // do something
}
第二种情况:

int n = getCount();

for (int i = 0; i < n; i ++) {
    // do something
}
for (int i = 0; i < getCount(); i ++) {
    // do something
}

结果代码可能不同,但根据
getCount()
,运行时可能会优化执行。一般来说,第一个代码似乎效率更高,尤其是当
getCount()
执行一些复杂的操作以返回其值时。

第一个代码比另一个代码效率更高


在第一个场景中,只调用一次getCount,而在第二个场景中,每次条件检查都调用getCount,这会增加循环的执行时间。

第一个场景比另一个场景更有效


在第一个场景中,您只调用一次getCount,而在第二个场景中,您为每个条件检查调用getCount,这会增加循环的执行时间。

问题不在于性能,因为第二个场景可能会更慢,因为

public class stuff {
    static int getCount() {
        System.out.println("get count");
        return 5;
    }
    public static void main(String[] args) {
        for (int i = 0; i < getCount(); i ++) {
            System.out.println("loop " + i);
        }
    }

}

您看到循环中的getCount被执行多次了吗?为什么这不是一个问题?你如何比较不同事物的表现?如果行为不重要,你可以很高兴地将
nop
世界上最复杂的竞争进行比较。

问题不在于性能,因为第二种可能会更慢

public class stuff {
    static int getCount() {
        System.out.println("get count");
        return 5;
    }
    public static void main(String[] args) {
        for (int i = 0; i < getCount(); i ++) {
            System.out.println("loop " + i);
        }
    }

}

您看到循环中的getCount被执行多次了吗?为什么这不是一个问题?你如何比较不同事物的表现?如果行为无关紧要,您可以将
nop
世界上最复杂的计算进行比较。

相信编译器,它会优化它。不要浪费时间。如果你有两匹马,你想知道哪匹马跑得更快,那就去比赛吧。相信编译器,它会优化它。不要浪费时间。如果你有两匹马,你想知道哪匹马跑得更快,那就去比赛吧。你能解释一下怎么做吗?在第二种情况下,它不会调用getCount()n次吗?@Sumedh它可能不相关。我敢打赌,如果你将两者作为基准点,两者之间的差异将可以忽略不计,甚至不存在。既然OP已经澄清了他的意思是getSize()而不是getCount(),是的,差异是可以忽略不计的。但是如果getCount()或任何方法是复杂的,这会有很大的不同。你能解释一下怎么做吗?在第二种情况下,它不会调用getCount()n次吗?@Sumedh它可能不相关。我敢打赌,如果你将两者作为基准点,两者之间的差异将可以忽略不计,甚至不存在。既然OP已经澄清了他的意思是getSize()而不是getCount(),是的,差异是可以忽略不计的。但是如果getCount()或任何方法是复杂的,如果getCount()使用数据库查询,会有很大的不同?然后,一行中可能有50个数据库查询,而只有1个。
getCount()
是一个坏例子,但它仍然有效@事实上,通常情况下,行为可能会有所不同。更新了答案。如果getCount()使用数据库查询怎么办?然后,一行中可能有50个数据库查询,而只有1个。
getCount()
是一个坏例子,但它仍然有效@事实上,通常情况下,行为可能会有所不同。更新了答案。我想更好的例子应该是
array.length
而不是
getCount()
@tambykojak
attayList.size()
一直困扰着我,直到Java 1.5引入foreachI,我想更好的例子应该是
array.length
而不是
getCount()
@tambykojak
attayList.size()
在Java 1.5引入foreach之前一直困扰着我