循环中的嵌套if语句与两个单独的循环

时间:2012-09-01 01:13:09

标签: java

以下是源代码:

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;
}

第一个代码片段必须有两个循环,但有些人说上面的代码性能很好。为什么呢?

4 个答案:

答案 0 :(得分:4)

实际上,两个片段都是一样的。但是,第二个代码段可能会执行得更糟,因为比较语句被多次评估,而不是第一个代码段中的单个比较。每个代码片段经历的循环迭代次数是相同的,但所需的比较次数不同。就这么简单。

答案 1 :(得分:0)

我们的想法是,第一个只需将onull进行一次比较,而第二个必须在循环中每次传递时将其进行比较。

答案 2 :(得分:0)

使用单个循环,您必须在每次迭代时重新检查条件 - 因此需要更多工作。

使用第一个示例,您只需检查一次条件。

如果在没有优化的情况下编译(以字面方式),那么第二个例子将会更慢。

但是,大多数编译器都有技巧,并且可以将第二个示例中的代码转换为与第一个示例相同的机器代码。但是,这在很大程度上取决于编译器优化标志(即优化的内容 - 运行时间或代码大小)

答案 3 :(得分:0)

第二种形式检查o == null是否size - 1,{{1}}次。

假设无论如何都没有为你做这样的优化。如果不尝试就不会有什么假设。

有时在循环中最终机器代码中使用较少的指令也会有优势,尽管它不太可能有任何区别。

减少可能分支的数量也可以提高性能,因为预取错误指令的可能性较小。 (感谢Andreas Henning)。

总之,当你需要优化某些东西时,在循环之外移动东西的想法是合理的,但在这种情况下可能不太重要。

只是看到你的评论。考虑到有多少代码出现在ArrayList.indexOf中,这是一个合理的地方来做你能想到的每一点压力。