++i真的比java中的for循环中的i++快吗?
2022-09-01 02:47:30
在java中,我通常会做一个for循环,如下所示:
for (int i = 0; i < max; i++) {
something
}
但最近一位同事打字说:
for (int i = 0; i < max; ++i) {
something
}
他说后者会更快。这是真的吗?
在java中,我通常会做一个for循环,如下所示:
for (int i = 0; i < max; i++) {
something
}
但最近一位同事打字说:
for (int i = 0; i < max; ++i) {
something
}
他说后者会更快。这是真的吗?
不,这不是真的。您可以通过为大量迭代的每个循环计时来衡量性能,但我相当确定它们将是相同的。
神话来自C,它被认为比前者更快,因为前者可以通过增加i然后返回它来实现。后者可以通过将 i 的值复制到临时变量来实现,递增 i,然后返回临时变量。第一个版本不需要制作临时副本,因此许多人认为它更快。但是,如果将表达式用作语句,则现代C编译器可以优化临时复制,以便在实践中没有区别。++i
i++
这个问题需要一些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()