java常量循环性能优化

时间:2018-11-29 11:28:00

标签: java optimization compiler-optimization

我有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是否在做一些事情来优化编译时或运行时中的第一个代码段?

3 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:0)

第二个效率更高,因为您在第一个代码段中执行了很多操作,(显然)这需要更多时间来执行和评估。

通常,您可以得出以下结论:更多的for循环/操作/ if语句表示较低的性能。

Java只会评估而不会将其简化为类似于第二个。

答案 2 :(得分:0)

第一个代码段需要花费时间: 创建列表对象,向列表中添加元素,为变量添加值,检查变量是否小于另一个变量,增加变量,跳转代码(中断循环和if语句),调用方法并执行它们

在第二个正弦中: 调用方法和执行方法。

如果将这两个代码片段都放入for循环中,并执行1000次或更多次,您会发现差异很大。