Java循环效率("for"与"foreach")

PNS*_*PNS 28 java performance foreach for-loop

(对于那些熟悉JVM编译和优化技巧的人来说一个问题...... :-)

是否有任何"for"和"foreach"模式明显优于其他模式?

考虑以下两个例子:

public void forLoop(String[] text)
{
    if (text != null)
    {
        for (int i=0; i<text.length; i++)
        {
            // Do something with text[i]
        }
    }
}

public void foreachLoop(String[] text)
{
    if (text != null)
    {
        for (String s : text)
        {
            // Do something with s, exactly as with text[i]
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

forLoop快还是慢foreachLoop

假设在这两种情况下text阵列都不需要进行任何健全性检查,是否有明显的赢家或仍然太接近无法拨打电话?

编辑:正如在一些答案中所指出的,对于数组,性能应该是相同的,而对于像List这样的抽象数据类型,"foreach"模式可能略微更好.另请参阅讨论该主题的答案.

Jon*_*eet 61

JLS第14.14.2节:

否则,Expression必须具有数组类型T [].设L1 ... Lm是紧接在增强的for语句之前的(可能是空的)标签序列.然后,增强的for语句的含义由以下基本语句给出:

T[] a = Expression;
L1: L2: ... Lm:
for (int i = 0; i < a.length; i++) {
        VariableModifiersopt Type Identifier = a[i];
        Statement
}
Run Code Online (Sandbox Code Playgroud)

换句话说,我希望它们最终被编译成相同的代码.

肯定有一个明显的赢家:增强的for循环更具可读性.这应该是您最关心的问题 - 当您已经证明最易读的形式表现不如您想要的那样时,您甚至应该考虑对这种事情进行微观优化.

  • +1强调可读性/可理解性的重要性! (13认同)

aln*_*ire 5

您可以编写自己的简单测试,用于测量执行时间。

long start = System.currentTimeMillis();
forLoop(text);
long end = System.currentTimeMillis();
long result = end - start;
Run Code Online (Sandbox Code Playgroud)

结果是执行时间。

  • 是的,测量执行时间并且应该具有一定程度有效性的测试从来都不是“简单的”。 (4认同)