最快的方式迭代一系列在Java:循环变vs增强对声明[重复]
-
06-07-2019 - |
题
这个问题已经有一个答案在这里:
- 是否有一个业绩差的一个循环和为每个循环? 17的答案
在爪哇,是它快要迭代,通过一系列的老式的方法,
for (int i = 0; i < a.length; i++)
f(a[i]);
或者使用更简洁的形式,
for (Foo foo : a)
f(foo);
用于对列表,是该回答的一样吗?
当然对于绝大部分应用程序代码,答案是,它没有任何明显的差别以更简洁的形式应当使用的可读性。然而背景下,我看到的是重型技术计算,业务就必须进行数十亿倍,因此即使微小的速度差别可能最终被重要的。
解决方案
如果你是循环,通过一系列的,它不应该的问题-加强的循环使用的阵列的访问。
例如,考虑这个代号:
public static void main(String[] args)
{
for (String x : args)
{
System.out.println(x);
}
}
当反编译与 javap -c Test
我们得到的(对的 main
方法):
public static void main(java.lang.String[]);
Code:
0: aload_0
1: astore_1
2: aload_1
3: arraylength
4: istore_2
5: iconst_0
6: istore_3
7: iload_3
8: iload_2
9: if_icmpge 31
12: aload_1
13: iload_3
14: aaload
15: astore 4
17: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
20: aload 4
22: invokevirtual #3; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
25: iinc 3, 1
28: goto 7
31: return
现在改变它使用一个明确的列访问:
public static void main(String[] args)
{
for (int i = 0; i < args.length; i++)
{
System.out.println(args[i]);
}
}
这decompiles:
public static void main(java.lang.String[]);
Code:
0: iconst_0
1: istore_1
2: iload_1
3: aload_0
4: arraylength
5: if_icmpge 23
8: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
11: aload_0
12: iload_1
13: aaload
14: invokevirtual #3; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
17: iinc 1, 1
20: goto 2
23: return
还有多一点安装码在增强的循环,但是它们基本上做同样的事情。没有迭代。此外,我期望它们得到JITted到更多类似的代码。
建议:如果你真的认为这可能会使一个显着的差异(这只会 曾经 做如果身体的循环绝对是微不足道),那么你应该基准,它与你真的应用程序。这是唯一情况事项。
其他提示
这完全属于竞技场 微优化.这真的没问题。风格我总是喜欢第二,因为它更加简明扼要,除非你需要的循环计数用于别的东西。并且那是 远远比这更重要的种微优化:可读性。
这就是说,对。不会有太大的差异,但一个链表将更加有效率的第二位。
衡量。答案在所有性能的问题可能取决于虚拟机版本,处理器、存储器的速度缓存等。因此你必须衡量它为你的特别是平台。
我个人会倾向于第二种变体,因为意图是更清楚的。如果性能成为一个问题我可以优化它以后不管怎么说-如果那个代码确实是重要的绩效的整体应用程序。
对于一个链表:
for(ClassOfElement element : listOfElements) {
System.out.println(element.getValue());
}
这是回答之前:
在一个阵列,或RandomAccess收集可以获得一个小小的增加速通过这样做:
List<Object> list = new ArrayList<Object>();
for (int i=0, d=list.size(); i<d; i++) {
something(list.get(i));
}
但我不会担心一般。优化这样的不会超过0.1%的差异,以你的代码。试图援引java -教授 看到你的代码实际上是花费时间。
甚至更快的是使用ParallelArray叉加入框架(如果你有足够大的数据集的).