gpt4 book ai didi

Java foreach 性能

转载 作者:行者123 更新时间:2023-12-01 07:26:35 25 4
gpt4 key购买 nike

我使用了"foreach"在我的Java中循环长期应用。最近我开始想知道以下之间的性能(甚至结果)是否存在显着差异:

Collection<String> collection = someMethod();
for(String element : collection) { ... }

和:

for(String element : someMethod()) { ... }

如果不是 Collection 会怎样?这是一个List ,一个Map ,一个Setarray

最佳答案

两种代码之间的差异可以从它们生成的字节码中看出。

第一个比第二个多了两条指令;它将 someMethod() 的返回值存储在本地堆栈上,然后再次加载它以访问其迭代器。

然而,第二个立即使用Iterator,而不将someMethod()的返回值存储在本地堆栈上。

下面的代码显示了 3:4: 指令的消除。

第一:

Collection<String> collection = someMethod();
for(String element : collection) { ... }

0: invokestatic #3 // Call someMethod()
3: astore_1 // Store the result as first item on local stack
4: aload_1 // Load the Collection again into operand stack
5: invokeinterface #4, 1 // Get Iterator (of Collection) - InterfaceMethod java/util/Collection.iterator:()Ljava/util/Iterator;
10: astore_2 // Store Iterator on local stack #2
11: aload_2 // LOOP STARTS - Load iterator
12: invokeinterface #5, 1 // InterfaceMethod java/util/Iterator.hasNext:()Z
17: ifeq 33
20: aload_2
21: invokeinterface #6, 1 // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
26: checkcast #7 // class java/lang/String
29: astore_3
30: goto 11 // LOOP ENDS
33: return

第二

for(String element : someMethod()) { ... }

0: invokestatic #3 // Call someMethod()
3: invokeinterface #4, 1 // Get Iterator (of Collection) - Interface Method java/util/Collection.iterator:()Ljava/util/Iterator;/
8: astore_1 // Store Iterator on local stack #2
9: aload_1 // LOOP STARTS - Load iterator
10: invokeinterface #5, 1 // InterfaceMethod java/util/Iterator.hasNext:()Z
15: ifeq 31
18: aload_1
19: invokeinterface #6, 1 // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
24: checkcast #7 // class java/lang/String
27: astore_2
28: goto 9 // LOOP ENDS
31: return

顺便说一句,我认为它们在性能方面不会有很大差异,因为两者在循环内都有 9 条指令。

关于Java foreach 性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23494344/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com