将一个循环分成两个循环的性能

Mat*_*hew 9 c++ big-o loops

美好的一天,

假设您有一个简单的for循环,如下所示......

for(int i=0;i<10;i++)
{
    //statement 1
    //statement 2
}
Run Code Online (Sandbox Code Playgroud)

假设语句1和语句2是O(1).除了"开始"另一个循环的小开销之外,将for循环分解成两个(不是嵌套的,但顺序的)循环同样快吗?例如...

for(int i=0;i<10;i++)
{
    //statement 1
}
for(int i=0;i<10;i++)
{
    //statement 2
}
Run Code Online (Sandbox Code Playgroud)

为什么我问这样一个愚蠢的问题是我有一个碰撞检测系统(CDS)必须遍历所有对象.我想"划分"我的CDS系统的功能,所以我可以简单地打电话

cds.update(objectlist);
Run Code Online (Sandbox Code Playgroud)

而不是必须破坏我的CD系统.(不要过分担心我的CDS实现......我想我知道我在做什么,我只是不知道如何解释它,我真正需要知道的是我是否因为循环而受到巨大的性能影响再次通过我的所有对象.

Mat*_* M. 5

这取决于您的应用程序。

(分裂)可能的缺点:

  • 您的数据不适合 L1 数据缓存,因此您在第一个循环中加载一次,然后在第二个循环中重新加载它

可能的收益(分裂):

  • 您的循环包含许多变量,拆分有助于减少寄存器/堆栈压力,优化器将其转换为更好的机器代码
  • 您使用的函数会垃圾化 L1 指令缓存,以便在每次迭代时加载缓存,而通过拆分,您可以在每个循环的第一次迭代时加载一次(仅)

这些列表当然并不全面,但您已经可以感觉到代码数据之间存在紧张关系。因此,当我们两者都不知道时,我们很难做出有根据的/疯狂的猜测。

有疑问:个人资料。使用callgrind,检查每种情况下的缓存未命中情况,检查执行的指令数。衡量所花费的时间。