++i真的比java中的for循环中的i++快吗?

在java中,我通常会做一个for循环,如下所示:

for (int i = 0; i < max; i++) {
   something
}

但最近一位同事打字说:

for (int i = 0; i < max; ++i) {
   something
}

他说后者会更快。这是真的吗?


答案 1

不,这不是真的。您可以通过为大量迭代的每个循环计时来衡量性能,但我相当确定它们将是相同的。

神话来自C,它被认为比前者更快,因为前者可以通过增加i然后返回它来实现。后者可以通过将 i 的值复制到临时变量来实现,递增 i,然后返回临时变量。第一个版本不需要制作临时副本,因此许多人认为它更快。但是,如果将表达式用作语句,则现代C编译器可以优化临时复制,以便在实践中没有区别。++ii++


答案 2

这个问题需要一些Java字节代码。请考虑以下代码:

public class PostPre {
    public static void main(String args[]) {
        int n = 5;
        loop1(n);
        loop2(n);
    }

    public static void loop1(int n) {
        for (int i = 0; i < n; i++) {}
    }

    public static void loop2(int n) {
        for (int i = 0; i < n; ++i) {}
    }
}

现在编译它并反汇编它:

$ javac PostPre.java; javap -c PostPre.class 
Compiled from "PostPre.java"
public class PostPre {
  public PostPre();
    Code:
       0: aload_0       
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return        

  public static void main(java.lang.String[]);
    Code:
       0: iconst_5      
       1: istore_1      
       2: iload_1       
       3: invokestatic  #2                  // Method loop1:(I)V
       6: iload_1       
       7: invokestatic  #3                  // Method loop2:(I)V
      10: return        

  public static void loop1(int);
    Code:
       0: iconst_0      
       1: istore_1      
       2: iload_1       
       3: iload_0       
       4: if_icmpge     13
       7: iinc          1, 1
      10: goto          2
      13: return        

  public static void loop2(int);
    Code:
       0: iconst_0      
       1: istore_1      
       2: iload_1       
       3: iload_0       
       4: if_icmpge     13
       7: iinc          1, 1
      10: goto          2
      13: return        
}

loop1()并具有相同的字节码。loop2()


推荐