java - 在 Java : loop variable vs enhanced for statement 中迭代数组的最快方法

标签 java performance iteration

在 Java 中,以老式方式遍历数组是否更快,

for (int i = 0; i < a.length; i++)
    f(a[i]);

或者使用更简洁的形式,

for (Foo foo : a)
    f(foo);

对于一个ArrayList,答案是否一样?

当然,对于大量应用程序代码,答案是它没有明显的区别,因此应使用更简洁的形式以提高可读性。然而,我正在查看的上下文是重型技术计算,必须执行数十亿次的操作,因此即使是微小的速度差异也可能最终会产生重大影响。

最佳答案

如果你正在循环一个数组,那应该没关系 - 增强的 for 循环无论如何都使用数组访问。

例如,考虑以下代码:

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]);
    }
}

这反编译为:

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

在增强的 for 循环中有更多设置代码,但它们基本上在做同样的事情。不涉及迭代器。此外,我希望他们能够 JITted 到更相似的代码。

建议:如果您真的认为它可能会产生重大影响(只有在循环体绝对微不足道的情况下永远才会这样做),那么您应该使用您的实际应用程序对其进行基准测试。这是唯一重要的情况。

关于java - 在 Java : loop variable vs enhanced for statement 中迭代数组的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1006395/

相关文章:

java 类级异常处理 - 在单个位置捕获所有方法的异常

java - 如何避免忘记处理属性?

Android:频繁存储传感器/GPS 数据会降低电池电量吗?

javascript - 减少加载大哈希表的正确方法

iphone - Webview 中的 PDF 性能

java - 多重递归迭代

java - 消费者生产者错误中的意外输出

java - Spring Data Mongodb - 用于收集不同类型的存储库

python - 将 python 字典表示为矩阵或 csv

python - 当在应用中也计算前一个值时,Pandas 中是否可以使用 dataframe.apply 中的前一行值?