DSP

优化for循环效率

2019-07-13 15:49发布

在程序非常大的时候,我们常常需要提高循环程序的使用效率 #include char *str="HUANGYONGZHI"; int main(int argc,char **argv) { int i; for(i=0;i
这个上边的程序程序的时间效率是多少呢? 很多人说,不就是n吗? 其实,不是。 这段代码的效率是n^2(n的平方),为什么? 我们在每次循环的时候,都会调用strlen函数,通过遍历去获得长度,这个函数的效率也是n。 所以,我们要再加一个变量,去优化: #include char *str="HUANGYONGZHI"; int main(int argc,char **argv) { int i,n; n=strlen(str); for(i=0;i
下面这个通过INTEL 的处理器优化for循环的这个例子,也是会让你大开眼界: #include int main(int argc,char **argv) { int i,m,k1,k2,k3,k4,k5,k6,k7,k8; m=10000000; for(i=0;i
我们再看这个for循环,我们是让这些数每次循环都加1,这个效率也不是达到了最优,是这样的,在每次for循环的时候,编译器会给变量i,变量m每个独占一个寄存器,因为是循环嘛,编译器给i和m也是为了效率考虑,不用再向寄存器加载每次循环的判断变量了,但是,一般基于Intel的处理器都只有8个通用寄存器,这样,我们就剩下了6个寄存器给for循环里的内容中的变量使用,但是,我们的变量有8个,我们这时会在把其他的变量入栈,这样,我们的效率变低了,每次出战或者入栈都会消耗两个CPU时钟周期,这样,我们就总共满了8个周期。

因此,我们可以将程序改成这样:
#include int main(int argc,char **argv) { int i,m,k1,k2,k3,k4,k5,k6,k7,k8; m=10000000; for(i=0;i
这样子的效率就大大提高了。