以下是源代码:
public int indexOf(Object o) {
if (o == null) {
for (int i = 0; i < size; i++)
if (elementData[i]==null)
return i;
} else {
for (int i = 0; i < size; i++)
if (o.equals(elementData[i]))
return i;
}
}
return -1;
}
为什么不这样做:只有一个循环和if语句。
public int indexOf(Object o) {
for (int i = 0; i < size; i++){
if (o == null) {
if (elementData[i]==null)
return i;
else {
if (o.equals(elementData[i]))
return i;
}
}
return -1;
}
第一个代码片段必须有两个循环,但有些人说上面的代码性能很好。为什么呢?
答案 0 :(得分:4)
答案 1 :(得分:0)
我们的想法是,第一个只需将o
与null
进行一次比较,而第二个必须在循环中每次传递时将其进行比较。
答案 2 :(得分:0)
使用单个循环,您必须在每次迭代时重新检查条件 - 因此需要更多工作。
使用第一个示例,您只需检查一次条件。
如果在没有优化的情况下编译(以字面方式),那么第二个例子将会更慢。
但是,大多数编译器都有技巧,并且可以将第二个示例中的代码转换为与第一个示例相同的机器代码。但是,这在很大程度上取决于编译器优化标志(即优化的内容 - 运行时间或代码大小)
答案 3 :(得分:0)
第二种形式检查o == null
是否size - 1
,{{1}}次。
假设无论如何都没有为你做这样的优化。如果不尝试就不会有什么假设。
有时在循环中最终机器代码中使用较少的指令也会有优势,尽管它不太可能有任何区别。
减少可能分支的数量也可以提高性能,因为预取错误指令的可能性较小。 (感谢Andreas Henning)。
总之,当你需要优化某些东西时,在循环之外移动东西的想法是合理的,但在这种情况下可能不太重要。
只是看到你的评论。考虑到有多少代码出现在ArrayList.indexOf中,这是一个合理的地方来做你能想到的每一点压力。