将循环分成较小的循环是否重要?

4
如果您有一个包含两个主要部分的 for 循环,类似于这样:
for (object o : objects){
doSomething(o);
doSomething2(o);
}

如果您像这样将循环分成两个较小的循环,是否会影响性能?

for (object o : objects){
doSomething(o);
}

for (object o : objects){
doSomething2(o);
}

从技术上讲,有点差,但无论哪种方式都是O(n)。在你真正遇到问题之前不要担心它。使用哪种方式使你的代码更易于管理就用哪种。 - khelwood
1
如果这两个操作必须同时进行,那么它们会影响性能和正确性。除非你有数据支持这样做,否则像这样的微小优化永远不是一个好主意。 - duffymo
@duffymo:哈哈,我们已经从微观优化转向了纳米优化,是吗?接下来是皮克! - T.J. Crowder
1
根据情况可能会好些或者更糟。要么针对你的目标平台进行度量,要么停止考虑这样的细节。 - Pascal Cuoq
在我的编译器设计课上,我学习了关于通过循环变换序列进行优化,特别是循环分裂/分配。它有时可以帮助提高引用的局部性,在特定的情况下才能实现。如果您愿意,我可以为此撰写答案。 - Am_I_Helpful
1个回答

6
从技术上讲,是的,您最终需要进行两次迭代。除非在一些可能操作的狭窄范围内,按定义这比迭代一次要慢。您还需要两次分配迭代器对象而不是一次等等。如果您正在处理一个庞大的列表,我想两个循环也可能会导致更多的内存分页。
在现实世界中?您必须拥有一个非常大的列表或非常慢的迭代器,才会产生影响。
主观上来说:如果你可以用两种方式之一来做它(例如,操作的顺序没有关系),那么我会选择以编写和阅读代码为出发点的方式。对于我来说,通常情况下,这将是一个循环,因为这样我就可以清楚地看到每个对象发生了什么,但是您可能有提出问题的原因。除非我知道我将处理真正巨大的东西(数十万甚至数百万条记录),或者我看到我正在解决的代码中存在现实世界的问题,否则我不会担心性能问题。

啊,那么使性能变差的唯一显著区别就是对象数组的大小? - user2997204
正确的(除非,正如duffymo所指出的那样,操作顺序很重要,否则你会有更大的问题)。但是,如果你在谈论一个数组,我想你必须有一个非常大的数组才会有影响。 - T.J. Crowder

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接