鉴于代码:
for (int i = 0; i < n; ++i)
{
A(i) ;
B(i) ;
C(i) ;
}
Run Code Online (Sandbox Code Playgroud)
和优化版本:
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)
}
Run Code Online (Sandbox Code Playgroud)
我不清楚:哪个更好?我看不到任何使用其他版本的速度更快的东西.我在这里错过了什么吗?
我只看到每条指令都依赖于前面的指令,这意味着我需要等待前一条指令完成才能启动后面的指令...
谢谢
在语言的高级视图中,您不会看到优化.速度增强来自编译器对您拥有的内容所做的事情.
在第一种情况下,它是这样的:
LOCATION_FLAG;
DO_SOMETHING;
TEST FOR LOOP COMPLETION;//Jumps to LOCATION_FLAG if false
Run Code Online (Sandbox Code Playgroud)
在第二个它是这样的:
LOCATION_FLAG;
DO_SOMETHING;
DO_SOMETHING;
DO_SOMETHING;
TEST FOR LOOP COMPLETION;//Jumps to LOCATION_FLAG if false
Run Code Online (Sandbox Code Playgroud)
在后一种情况下,您可以看到测试和跳转的开销仅为每3个指令1个.在第一个中,每1个指令1个; 所以它经常发生.
因此,如果你有不变量,你可以依赖(mod 3的数组,使用你的例子),那么展开循环更有效,因为底层程序集更直接地编写.
| 归档时间: |
|
| 查看次数: |
12010 次 |
| 最近记录: |