给定代码:
for (int i = 0; i < n; ++i)
{
A(i) ;
B(i) ;
C(i) ;
}
以及优化版本:
for (int i = 0; i < (n - 2); i+=3)
{
A(i)
A(i+1)
A(i+2)
B(i)
B(i+1)
B(i+2)
C(i)
C(i+1)
C(i+2)
}
我不清楚:哪个更好?我看不出使用其他版本可以更快地工作。我在这里错过了什么吗?
我所看到的是每条指令都依赖于前一条指令,这意味着
我需要等待上一条指令完成才能开始下一条指令......
Thanks
在语言的高级视图中,您不会看到优化。速度的提高来自于编译器对你所拥有的东西的处理。
在第一种情况下,它是这样的:
LOCATION_FLAG;
DO_SOMETHING;
TEST FOR LOOP COMPLETION;//Jumps to LOCATION_FLAG if false
在第二个中,它是这样的:
LOCATION_FLAG;
DO_SOMETHING;
DO_SOMETHING;
DO_SOMETHING;
TEST FOR LOOP COMPLETION;//Jumps to LOCATION_FLAG if false
您可以看到,在后一种情况下,测试和跳转的开销仅为每 3 条指令。在第一种情况下,每 1 条指令;在第一种情况下,每 1 条指令为 1 条指令。所以这种情况发生得更频繁。
因此,如果您有可以依赖的不变量(mod 3 的数组,以使用您的示例),那么展开循环会更有效,因为底层程序集是更直接编写的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)