我有2段代码:

第一:

List<Integer> integers = new ArrayList<>();
integers.add(0);
integers.add(1);
//Assume that list will always have the same values with loop indices.
//Also any of the methods will not change the size and elements of the list.

for (int i=0;i<integers.size();i++) {

    if (0 == integers.get(i)) {
        foo();
    }
    else if (1 == integers.get(i)) {
        bar();
    }
}


第二个:

foo();
bar();


我知道两个代码段都在做相同的事情,但是性能上有什么区别吗?或者JVM是否在优化编译时或运行时的第一个代码段方面做了某些事情?

最佳答案

在第一个代码段中,编译器/ JIT不能做很多事情。

它不能证明对integers.get(i)的连续调用将始终产生相同的结果,因此不允许重复使用第一个调用的结果,甚至不能说foo()bar()中的一个将始终被执行。 。

该代码对于人类来说似乎很简单,但是编译器将不得不对将在运行时加载的ArrayList的实现进行假设,而不会这样做。

关于java - java常量循环性能优化,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53538001/

10-11 19:53