循环展开和优化

JAN*_*JAN 5 c optimization

鉴于代码:

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)

我不清楚:哪个更好?我看不到任何使用其他版本的速度更快的东西.我在这里错过了什么吗?

我只看到每条指令都依赖于前面的指令,这意味着我需要等待前一条指令完成才能启动后面的指令...

谢谢

Nat*_*ord 9

在语言的高级视图中,您不会看到优化.速度增强来自编译器对您拥有的内容所做的事情.

在第一种情况下,它是这样的:

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的数组,使用你的例子),那么展开循环更有效,因为底层程序集更直接地编写.