2013-03-07 93 views
3

我有以下一段简单的代码可能会被执行数千万次;是否VS2010 C++优化循环展开

for (int i = 0; i < 8; i++) 
    if (((p[i].X >= x) && (p[i].X <= x + d)) 
     &&((p[i].Y >= y) && (p[i].Y <= y + d)) 
     &&((p[i].Z >= z) && (p[i].Z <= z + d))) 
     return 1; 

将在Visual C++编译器2010的优化展开这个循环对我来说,还是我最好做手工?我看过other similar questions,但没有看到任何具体结果。我

+1

如果您不确定并且循环时间不是太长,自行展开并没有太大的伤害 - 假设它当然是一个瓶颈,并且您希望获得更多性能,同时可能降低可读性。虽然我会想象VS2010会展开循环。 – Rapptz 2013-03-07 09:05:57

+1

你知道这个代码运行的确切硬件平台吗?然后,我会建议简单地手动展开它,并测量发生的事情,而不是猜测编译器做了什么(基于他的猜测:-))。 – Philipp 2013-03-07 09:08:46

+0

我希望VS2010会为我做这件事,但可能会尝试分析这两个版本。也许看看汇编输出。 – 2013-03-07 09:08:55

回答

1

真正的问题是,你从展开得到什么?

为每个“展开”展开一个分支的剃须(if i >= 8 stop)。

您的循环体已包含6个分支(if * 1,|| * 2,&& * 3);那么展开它有什么好处呢?

查看代码是如何优化可能很有趣;但我很不确定展开应该是你的主要焦点,我会更担心复杂条件如何处理!

+0

条件是检查一组8点中的任何一点是否位于笛卡尔空间中的轴对齐立方体内。在展开时,我想知道用[n]代替[i](其中n是否为常数)是否也会删除索引操作。 – 2013-03-07 10:56:33

+0

@ShaneMacLaughlin:那么需要优化的方程首先要确定:) – 2013-03-07 13:15:02