java循环的效率_关于性能:Java循环效率(“for”与“foreach”)

本问题已经有最佳答案,请猛点这里访问。

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

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

考虑以下两个例子:

public void forLoop(String[] text)

{

if (text != null)

{

for (int i=0; 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]

}

}

}

forLoop比foreachLoop更快还是更慢?

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

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

答案256859确实涵盖了我的问题,但不知怎的,它没有弹出我的搜索。 感谢大家!

从JLS第14.14.2节:

Otherwise, the Expression necessarily has an array type, T[]. Let L1 ... Lm be the (possibly empty) sequence of labels immediately preceding the enhanced for statement. Then the meaning of the enhanced for statement is given by the following basic for statement:

T[] a = Expression;

L1: L2: ... Lm:

for (int i = 0; i < a.length; i++) {

VariableModifiersopt Type Identifier = a[i];

Statement

}

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

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

+1强调可读性/可理解性的重要性!

@Kevin:你有可以分享的基准吗?这不是一个jit优化 - 它只是如何为数组编译循环。

@JonSkeet我以为我做了,但现在我不能复制我前几天看到的东西。评论撤回了。

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

long start = System.currentTimeMillis();

forLoop(text);

long end = System.currentTimeMillis();

long result = end - start;

结果是执行时间。

看似是,但实际上有太多其他参数会影响这种测量(甚至执行测试的顺序),认为它是可靠的。

是的,测量执行时间并且应该具有一定程度有效性的测试从来都不是"简单"。

@PNS:测量(在现实情况下)比测量更好。通过测量,你只能被误导;有了猜测,你可能会出错。

我发现在执行相同代码块时,foreachs的执行时间小于for循环。

您应该选择几乎每次都更具可读性的选项,除非您知道存在性能问题。

在这种情况下,我会说他们保证是一样的。

唯一的区别是你额外检查text.length,这可能会更慢,而不是更快。

我还要确保文本永远不会静态。例如使用@NotNull注释。最好在编译/构建时捕获这些问题(并且会更快)

由于您使用的是array类型,因此性能差异无关紧要。在完成optimization漏斗后,他们最终会提供相同的性能。

但是如果你使用像List这样的ADT,那么与多个get(i)调用相比,forEachLoop显然是最佳选择。

加上是的,你不应该依赖这样的optimization细节,你可以随时失望。

即使对于数组,使用for-each循环也没有性能损失。实际上,在某些情况下,它可能比普通的for循环提供轻微的性能优势,因为它只计算一次数组索引的限制。有关详细信息,请点击此帖

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值