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

Java 循环中的嵌套if语句与两个单独的循环,java,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(elem

以下是源代码:

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;
}
public int indexOf(对象o){
如果(o==null){
对于(int i=0;i
为什么不这样做:只有一个循环和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;
}
public int indexOf(对象o){
对于(int i=0;i

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

实际上,两个代码段的性能相同。但是,第二个代码段的性能可能会更差,因为比较语句被多次计算,而不是在第一个代码段中只进行一次比较。循环迭代次数eac代码片段经过的过程是相同的,但所需的比较次数不同。就这么简单。

思想是第一个代码片段只需将
o
null
进行一次比较,而第二个代码片段必须在循环中的每一次过程中对其进行比较。

对于单个循环,您必须在每次迭代时重新检查条件-h我需要更多的工作

对于第一个示例,只需检查一次条件

如果编译时没有进行优化(以文字方式),那么第二个示例的速度会较慢


但是,大多数编译器都有技巧,可以将第二个示例中的代码转换为与第一个示例中的代码等效的机器代码。然而,这在很大程度上取决于编译器优化标志(即优化的内容-运行时间或代码大小)第二个表单检查
o==null
与否,
size-1
的次数更少

假设这样的优化并不是为你做的,这是不需要尝试的

有时,在循环中的最终机器代码中包含较少的指令也有好处,尽管这不太可能产生任何影响

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

总之,当您需要优化某些内容时,将内容移到循环之外的想法是合理的,但在这种情况下可能并不重要


看看你的评论。考虑到有多少代码进入ArrayList.indexOf,这是一个合理的地方,可以做你能想到的每一点压缩。

不是数组列表,对你要问的问题有点不清楚。直接回答这个问题,是的,代码有两个循环,但只有一个可以执行。第二段代码h作为一个循环,但每次都会检查布尔条件,这会降低性能。不过,大多数情况下,您不需要像这样进行不必要的优化,因此可以采用任何一种方法(除非速度至关重要).顺便说一句,我认为这个问题不值得否决。它涵盖了软件工程的一些基础知识,但它仍然是一个有效的问题,可以作为其他问题的有用参考。谢谢,这段代码是ArrayList#indexOf()方法,当我查看源代码时,我发现了这个。在我看来像java。jvm能够优化这样的东西吗?我的意思是,它基本上只是一种可怕而低效的风格,没有人会想到写它。@AndreasHenning我很久没有读过任何关于jvm优化的书了,但是现在谈论的那种东西恩,我做的远远超出了对本地进行检查的范围,就像这样。我不知道优化了什么,但javac有一个-O标志,它可能会进行一些优化。许多优化实际上是在运行时使用JIT编译器完成的。依赖。循环中没有太多其他内容。如果代码按字面意思编译/解释,那么“规模很大,那么令人惊讶的昂贵条件分支可能会对性能产生重大影响。@AndreasHenning我完全忘记了分支成本。打得好。”。