以下运行时是否存在差异:

时间:2009-07-15 20:49:10

标签: performance loops nested-loops

以下两个片段的运行时间是否存在差异?

SNIPPET 1:

for ( Object obj : collection ) {
    step1( obj );
    step2( obj );
    step3( obj );
}

SNIPPET 2:

for ( Object obj : collection ) {
    step1( obj );
}

for ( Object obj : collection ) {
    step2( obj );
}

for ( Object obj : collection ) {
    step3( obj );
}

6 个答案:

答案 0 :(得分:1)

当然。第一个代码段仅在集合中迭代一次,而第二个代码段则单独执行3次。第二个片段也违反了DRY原则。

答案 1 :(得分:0)

如果您询问任何语言,SNIPPET 1应该更快。

答案 2 :(得分:0)

迭代次数为3次。

此外,你将调用step1(obj)n次,然后调用step2(obj)n次,然后调用step3(obj)n次。

答案 3 :(得分:0)

如果你的一个方法调用将抛出异常,让我们在迭代过程中说step1,那么第二个版本将比第一个版本早停止。但是如果step3为第一个元素抛出异常,那么第一个版本会更快。所以这两个版本在语义上并不相同。

答案 4 :(得分:0)

有什么区别吗?当然。

重要的是有区别吗?这一切都取决于。

如果StepN()需要几纳秒,那么是的。否则,可能不会。

答案 5 :(得分:0)

您是否具体询问性能?

在这种情况下,答案取决于集合的迭代器的速度:如果Next()对于该特定迭代器来说是一个昂贵的操作,那么你在第一个迭代器中支付N次成本版本和后者的3N次。如果你的集合是一个向量,这是无关紧要的,但是当你的集合是一个慢速文件I / O操作的接口时,这是更严重的。