0

以下两个片段的运行时间有区别吗?

片段 1:

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

片段 2:

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

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

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

6 回答 6

1

当然。第一个片段仅遍历集合一次,而第二个片段单独执行 3 次。第二个片段也违反了 DRY 原则。

于 2009-07-15T20:51:26.700 回答
0

有什么区别吗?当然。

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

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

于 2009-07-16T00:32:33.290 回答
0

您是在专门询问性能吗?

在这种情况下,答案取决于集合的迭代器有多快:如果Next()该特定迭代器的操作成本很高,那么您在第一个版本中支付 N 倍的成本,在后者中支付 3N 倍的成本。如果您的集合是一个向量,这无关紧要,但当您的集合是一些慢速文件 I/O 操作的接口时,这一点就更严重了。

于 2009-07-16T00:38:14.197 回答
0

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

于 2009-07-15T20:52:27.417 回答
0

迭代进行 3 次。

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

于 2009-07-15T20:53:04.170 回答
0

如果您的某个方法调用将引发异常,例如在迭代中间的 step1,那么第二个版本将比第一个版本更早停止。但是如果 step3 对第一个元素抛出异常,那么第一个版本会更快。所以这两个版本在语义上是不等价的。

于 2009-07-15T22:33:58.290 回答