这个问题已经有一个答案在这里:

在爪哇,是它快要迭代,通过一系列的老式的方法,

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叉加入框架(如果你有足够大的数据集的).

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top