我有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是否在做一些事情来优化编译时或运行时中的第一个代码段?
答案 0 :(得分:2)
第一个代码段的编译器/ JIT不能做很多事情。
它不能证明对integers.get(i)
的连续调用将始终产生相同的结果,因此不允许重用第一个调用的结果,甚至不能告诉foo()
或bar()
将始终被执行。
代码对于人类来说似乎很简单,但是编译器必须对将在运行时加载的ArrayList
的实现进行假设,而不会这样做。
答案 1 :(得分:0)
第二个效率更高,因为您在第一个代码段中执行了很多操作,(显然)这需要更多时间来执行和评估。
通常,您可以得出以下结论:更多的for循环/操作/ if语句表示较低的性能。
Java只会评估而不会将其简化为类似于第二个。
答案 2 :(得分:0)
第一个代码段需要花费时间: 创建列表对象,向列表中添加元素,为变量添加值,检查变量是否小于另一个变量,增加变量,跳转代码(中断循环和if语句),调用方法并执行它们
在第二个正弦中: 调用方法和执行方法。
如果将这两个代码片段都放入for循环中,并执行1000次或更多次,您会发现差异很大。