你的for循环真的高效吗——优化for循环第一章
2011-05-29 18:32
302 查看
在我们所写的程序中,几乎没有不用到for循环的,但是,对于for循环,很多人确实效率很低的,包括我看得很多代码,for循环的执行效率非常低,下面我就举个例子来说明:
这个上边的程序程序我想大家都明白,那我问问读者,你知道这个程序的效率是多少吗?
你肯定不屑的说,不就是n吗?其实,你错了,你说的n只是在算法层面上的优化,其实对于底层的优化还没做好,这段代码的效率是n^2(n的平方),为什么?是这样的,我们在每次循环的时候,都会调用strlen函数,这个函数的效率也是n,所以,我们要再加一个变量,比如下边所看到的,
这个程序的效率是2n,当n很大时,我就不说了。
再看这个例子:
我们再看这个for循环,我们是让这些数每次循环都加1,这个效率也不是达到了最优,是这样的,在每次for循环的时候,编译器会给变量i,变量m每个独占一个寄存器,因为是循环嘛,编译器给i和m也是为了效率考虑,不用再向寄存器加载每次循环的判断变量了,但是,一般基于Intel的处理器都只有8个通用寄存器,这样,我们就剩下了6个寄存器给for循环里的内容中的变量使用,但是,我们的变量有8个,我们这时会在把其他的变量入栈,这样,我们的效率变低了,每次出战或者入栈都会消耗两个CPU时钟周期,这样,我们就总共满了8个周期,但是,如果更多呢?呵呵!
我们可以这样该我们的程序;
这样的效率就得到了很大改善!
结束话:故天将大任于斯人也,必先苦其心志,劳其筋骨,饿其体肤,空乏其身,行拂乱其所为,所以动心忍性,增益己所不能!——孟子
#include <stdio.h> char *string="zhangbo"; int main(int argc,char **argv) { int i; for(i=0;i<strlen(string);i++) printf("%i/n",i); return (0); }
这个上边的程序程序我想大家都明白,那我问问读者,你知道这个程序的效率是多少吗?
你肯定不屑的说,不就是n吗?其实,你错了,你说的n只是在算法层面上的优化,其实对于底层的优化还没做好,这段代码的效率是n^2(n的平方),为什么?是这样的,我们在每次循环的时候,都会调用strlen函数,这个函数的效率也是n,所以,我们要再加一个变量,比如下边所看到的,
#include <stdio.h> char *string="zhangbo"; int main(int argc,char **argv) { int i,k; k=strlen(zhangbo); for(i=0;i<k;i++) printf("%i/n",i); return (0); }
这个程序的效率是2n,当n很大时,我就不说了。
再看这个例子:
#include <stdio.h> int main(int argc,char **argv) { int i,m,k1,k2,k3,k4,k5,k6,k7,k8; m=10000000; for(i=0;i<m;i++){ k1++; k5++; k2++; k6++; k3++; k7++; k4++; k8++; } return (0); }
我们再看这个for循环,我们是让这些数每次循环都加1,这个效率也不是达到了最优,是这样的,在每次for循环的时候,编译器会给变量i,变量m每个独占一个寄存器,因为是循环嘛,编译器给i和m也是为了效率考虑,不用再向寄存器加载每次循环的判断变量了,但是,一般基于Intel的处理器都只有8个通用寄存器,这样,我们就剩下了6个寄存器给for循环里的内容中的变量使用,但是,我们的变量有8个,我们这时会在把其他的变量入栈,这样,我们的效率变低了,每次出战或者入栈都会消耗两个CPU时钟周期,这样,我们就总共满了8个周期,但是,如果更多呢?呵呵!
我们可以这样该我们的程序;
#include <stdio.h> int main(int argc,char **argv) { int i,m,k1,k2,k3,k4,k5,k6,k7,k8; m=10000000; for(i=0;i<m;i++){ k1++; k5++; k2++; k6++; } for(i=0;i<m;i++){ k3++; k7++; k4++; k8++; } return (0) }
这样的效率就得到了很大改善!
结束话:故天将大任于斯人也,必先苦其心志,劳其筋骨,饿其体肤,空乏其身,行拂乱其所为,所以动心忍性,增益己所不能!——孟子
相关文章推荐
- 你的for循环真的高效吗——优化for循环第一章
- 你的for循环真的高效吗——优化for循环第一章
- Java高效编码:for-each循环优先于传统的for循环
- MATLAB中对矩阵元素操作的for循环优化方法
- for-each循环应优先于传统的for循环
- 菜鸟要做架构师(二)——java性能优化之for循环
- java性能优化之for循环
- java基础_day0015_循环_for_嵌套_优化
- JS之for循环优化
- C++在循环内和循环外定义变量的差异(如何写出高效的for循环)
- Java如何跳出双重for循环和单重for循环
- for循环计算阶乘的和,for循环计算阶乘倒数的和
- 你的for循环真的高效吗——优化for循环第二章
- for 循环性能比较 提高for循环的效率
- Effective Java - 第46条:for-each循环优先于传统的for循环
- 第46条:for-each循环优先于传统的for循环
- 用两个for循环和一个for循环方式为二维数组赋初值并求出正对角线元素之和
- 【Java语言】嵌套For循环性能优化案例
- [置顶] java性能优化之for循环
- for循环、for-in、forEach、for-of四大循环