Java 循环效率(“for” vs. “foreach”)

2022-09-01 12:28:42

(对于那些非常了解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]
        }
    }
}

比 更快还是更慢 ?forLoopforeachLoop

假设在这两种情况下,数组都不需要任何健全性检查,那么是否有明显的赢家或仍然太接近而无法进行调用?text

编辑:正如在一些答案中所指出的,数组的性能应该是相同的,而对于抽象数据类型(如List),“foreach”模式可能会稍微好一些。另请参阅讨论该主题的此答案


答案 1

JLS 的第 14.14.2 节中可以看出:

否则,表达式必须具有数组类型 T[]。让 L1 ...Lm 是紧靠增强 for 语句前面的标签序列(可能是空的)。然后,增强 for 语句的含义由以下基本 for 语句给出:

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

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

绝对有一个明显的赢家:增强的for循环更具可读性。这应该是你的主要关注点 - 你甚至应该考虑微优化这种事情,当你证明最可读的形式表现不如你想要的。


答案 2

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

long start = System.currentTimeMillis();
forLoop(text);
long end = System.currentTimeMillis();
long result = end - start;

结果是执行时间。