如果您想知道您的机器上哪个“更快”,请运行它。
如果我们想知道哪个需要更多指令来执行,那么我们可以查看字节码。
对于第一种方法,我们得到这个(调用javap -c
)
Code:
0: iconst_0
1: istore_1
2: getstatic #2 // Field listOfItems:Ljava/util/List;
5: invokeinterface #3, 1 // InterfaceMethod java/util/List.iterator:()Ljava/util/Iterator;
10: astore_2
11: aload_2
12: invokeinterface #4, 1 // InterfaceMethod java/util/Iterator.hasNext:()Z
17: ifeq 50
20: aload_2
21: invokeinterface #5, 1 // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
26: checkcast #6 // class Item
29: astore_3
30: iload_1
31: ifne 41
34: aload_3
35: invokevirtual #7 // Method Item.isSomething:()Z
38: ifeq 45
41: iconst_1
42: goto 46
45: iconst_0
46: istore_1
47: goto 11
50: iload_1
51: ireturn
我们对循环的内部感兴趣,即第 29-46 行(第 11-26 行是迭代器的内容)。所以大约有10条指令。
对于第二种方法,我们得到这个:
Code:
0: getstatic #2 // Field listOfItems:Ljava/util/List;
3: invokeinterface #3, 1 // InterfaceMethod java/util/List.iterator:()Ljava/util/Iterator;
8: astore_1
9: aload_1
10: invokeinterface #4, 1 // InterfaceMethod java/util/Iterator.hasNext:()Z
15: ifeq 40
18: aload_1
19: invokeinterface #5, 1 // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
24: checkcast #6 // class Item
27: astore_2
28: aload_2
29: invokevirtual #7 // Method Item.isSomething:()Z
32: ifeq 37
35: iconst_1
36: ireturn
37: goto 9
40: iconst_0
41: ireturn
感兴趣的行是 27-37。所以 7 条指令。
从数字的角度来看,第二种方法排在首位(请注意,我们假设所有堆栈操作都需要相同的时间来执行)。