欢迎来到天天文库
浏览记录
ID:18461153
大小:112.50 KB
页数:6页
时间:2018-09-18
《你的for循环真的高效吗——优化for循环》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、在我们所写的程序中,几乎没有不用到for循环的,但是,对于for循环,很多人确实效率很低的,包括我看得很多代码,for循环的执行效率非常低,下面我就举个例子来说明:viewplaincopytoclipboardprint?1#include2char*string="zhangbo";3intmain(intargc,char**argv)4{5inti;6for(i=0;i2、,不就是n吗?其实,你错了,你说的n只是在算法层面上的优化,其实对于底层的优化还没做好,这段代码的效率是n^2(n的平方),为什么?是这样的,我们在每次循环的时候,都会调用strlen函数,这个函数的效率也是n,所以,我们要再加一个变量,比如下边所看到的,viewplaincopytoclipboardprint?10#include11char*string="zhangbo";12intmain(intargc,char**argv)13{14inti,k;15k=strlen(zhangbo);16for(i=0;i3、i);18return(0);19}这个程序的效率是2n,当n很大时,我就不说了。再看这个例子:viewplaincopytoclipboardprint?20#include21intmain(intargc,char**argv)22{23inti,m,k1,k2,k3,k4,k5,k6,k7,k8;24m=10000000;12for(i=0;i4、的,在每次for循环的时候,编译器会给变量i,变量m每个独占一个寄存器,因为是循环嘛,编译器给i和m也是为了效率考虑,不用再向寄存器加载每次循环的判断变量了,但是,一般基于Intel的处理器都只有8个通用寄存器,这样,我们就剩下了6个寄存器给for循环里的内容中的变量使用,但是,我们的变量有8个,我们这时会在把其他的变量入栈,这样,我们的效率变低了,每次出战或者入栈都会消耗两个CPU时钟周期,这样,我们就总共满了8个周期,但是,如果更多呢?呵呵!我们可以这样该我们的程序;viewplaincopytoclipboardprint?10#include11intmain5、(intargc,char**argv)12{13inti,m,k1,k2,k3,k4,k5,k6,k7,k8;14m=10000000;1516for(i=0;i6、个程序:viewplaincopytoclipboardprint?1#include2char*hello="hello";3char*__=",";1intmain()2{3char*world="world";4printf("%s%s%s",hello,__,world);5return0;6}我们都知道这个程序输hello,world,对了!我们却不知道字符串hello,字符串__,字符串world是不是在一个位置,如果你觉得,不必关心这些了,反正程序已经达到了效果,那么请你离开这个网页,不要浪费你的时间。回到计算机上来,我们要让计算机发挥最大的性能,就7、必须也要像“了解汽车内部结构的工程师”一样的了解计算机,我时常赞叹计算机设计的优美。为了加快访问的速度,我们加入了缓存,缓存的加入,就像我们在超高速行驶汽车时,再优秀的发动机也不能完全燃烧汽油,而且速度越高,会由于空气的不足,导致汽油燃烧不尽,从而成了汽车提速的瓶颈,然后,我们在汽车的身上再多开几个洞(这就是你为什么见到豪华跑车身上都有几个洞),把空气压缩进发动起,从而提高速度。这和计算机缓存有着异曲同工之妙,好好利用,就相当于,你比别人跑得更
2、,不就是n吗?其实,你错了,你说的n只是在算法层面上的优化,其实对于底层的优化还没做好,这段代码的效率是n^2(n的平方),为什么?是这样的,我们在每次循环的时候,都会调用strlen函数,这个函数的效率也是n,所以,我们要再加一个变量,比如下边所看到的,viewplaincopytoclipboardprint?10#include11char*string="zhangbo";12intmain(intargc,char**argv)13{14inti,k;15k=strlen(zhangbo);16for(i=0;i3、i);18return(0);19}这个程序的效率是2n,当n很大时,我就不说了。再看这个例子:viewplaincopytoclipboardprint?20#include21intmain(intargc,char**argv)22{23inti,m,k1,k2,k3,k4,k5,k6,k7,k8;24m=10000000;12for(i=0;i4、的,在每次for循环的时候,编译器会给变量i,变量m每个独占一个寄存器,因为是循环嘛,编译器给i和m也是为了效率考虑,不用再向寄存器加载每次循环的判断变量了,但是,一般基于Intel的处理器都只有8个通用寄存器,这样,我们就剩下了6个寄存器给for循环里的内容中的变量使用,但是,我们的变量有8个,我们这时会在把其他的变量入栈,这样,我们的效率变低了,每次出战或者入栈都会消耗两个CPU时钟周期,这样,我们就总共满了8个周期,但是,如果更多呢?呵呵!我们可以这样该我们的程序;viewplaincopytoclipboardprint?10#include11intmain5、(intargc,char**argv)12{13inti,m,k1,k2,k3,k4,k5,k6,k7,k8;14m=10000000;1516for(i=0;i6、个程序:viewplaincopytoclipboardprint?1#include2char*hello="hello";3char*__=",";1intmain()2{3char*world="world";4printf("%s%s%s",hello,__,world);5return0;6}我们都知道这个程序输hello,world,对了!我们却不知道字符串hello,字符串__,字符串world是不是在一个位置,如果你觉得,不必关心这些了,反正程序已经达到了效果,那么请你离开这个网页,不要浪费你的时间。回到计算机上来,我们要让计算机发挥最大的性能,就7、必须也要像“了解汽车内部结构的工程师”一样的了解计算机,我时常赞叹计算机设计的优美。为了加快访问的速度,我们加入了缓存,缓存的加入,就像我们在超高速行驶汽车时,再优秀的发动机也不能完全燃烧汽油,而且速度越高,会由于空气的不足,导致汽油燃烧不尽,从而成了汽车提速的瓶颈,然后,我们在汽车的身上再多开几个洞(这就是你为什么见到豪华跑车身上都有几个洞),把空气压缩进发动起,从而提高速度。这和计算机缓存有着异曲同工之妙,好好利用,就相当于,你比别人跑得更
3、i);18return(0);19}这个程序的效率是2n,当n很大时,我就不说了。再看这个例子:viewplaincopytoclipboardprint?20#include21intmain(intargc,char**argv)22{23inti,m,k1,k2,k3,k4,k5,k6,k7,k8;24m=10000000;12for(i=0;i4、的,在每次for循环的时候,编译器会给变量i,变量m每个独占一个寄存器,因为是循环嘛,编译器给i和m也是为了效率考虑,不用再向寄存器加载每次循环的判断变量了,但是,一般基于Intel的处理器都只有8个通用寄存器,这样,我们就剩下了6个寄存器给for循环里的内容中的变量使用,但是,我们的变量有8个,我们这时会在把其他的变量入栈,这样,我们的效率变低了,每次出战或者入栈都会消耗两个CPU时钟周期,这样,我们就总共满了8个周期,但是,如果更多呢?呵呵!我们可以这样该我们的程序;viewplaincopytoclipboardprint?10#include11intmain5、(intargc,char**argv)12{13inti,m,k1,k2,k3,k4,k5,k6,k7,k8;14m=10000000;1516for(i=0;i6、个程序:viewplaincopytoclipboardprint?1#include2char*hello="hello";3char*__=",";1intmain()2{3char*world="world";4printf("%s%s%s",hello,__,world);5return0;6}我们都知道这个程序输hello,world,对了!我们却不知道字符串hello,字符串__,字符串world是不是在一个位置,如果你觉得,不必关心这些了,反正程序已经达到了效果,那么请你离开这个网页,不要浪费你的时间。回到计算机上来,我们要让计算机发挥最大的性能,就7、必须也要像“了解汽车内部结构的工程师”一样的了解计算机,我时常赞叹计算机设计的优美。为了加快访问的速度,我们加入了缓存,缓存的加入,就像我们在超高速行驶汽车时,再优秀的发动机也不能完全燃烧汽油,而且速度越高,会由于空气的不足,导致汽油燃烧不尽,从而成了汽车提速的瓶颈,然后,我们在汽车的身上再多开几个洞(这就是你为什么见到豪华跑车身上都有几个洞),把空气压缩进发动起,从而提高速度。这和计算机缓存有着异曲同工之妙,好好利用,就相当于,你比别人跑得更
4、的,在每次for循环的时候,编译器会给变量i,变量m每个独占一个寄存器,因为是循环嘛,编译器给i和m也是为了效率考虑,不用再向寄存器加载每次循环的判断变量了,但是,一般基于Intel的处理器都只有8个通用寄存器,这样,我们就剩下了6个寄存器给for循环里的内容中的变量使用,但是,我们的变量有8个,我们这时会在把其他的变量入栈,这样,我们的效率变低了,每次出战或者入栈都会消耗两个CPU时钟周期,这样,我们就总共满了8个周期,但是,如果更多呢?呵呵!我们可以这样该我们的程序;viewplaincopytoclipboardprint?10#include11intmain
5、(intargc,char**argv)12{13inti,m,k1,k2,k3,k4,k5,k6,k7,k8;14m=10000000;1516for(i=0;i6、个程序:viewplaincopytoclipboardprint?1#include2char*hello="hello";3char*__=",";1intmain()2{3char*world="world";4printf("%s%s%s",hello,__,world);5return0;6}我们都知道这个程序输hello,world,对了!我们却不知道字符串hello,字符串__,字符串world是不是在一个位置,如果你觉得,不必关心这些了,反正程序已经达到了效果,那么请你离开这个网页,不要浪费你的时间。回到计算机上来,我们要让计算机发挥最大的性能,就7、必须也要像“了解汽车内部结构的工程师”一样的了解计算机,我时常赞叹计算机设计的优美。为了加快访问的速度,我们加入了缓存,缓存的加入,就像我们在超高速行驶汽车时,再优秀的发动机也不能完全燃烧汽油,而且速度越高,会由于空气的不足,导致汽油燃烧不尽,从而成了汽车提速的瓶颈,然后,我们在汽车的身上再多开几个洞(这就是你为什么见到豪华跑车身上都有几个洞),把空气压缩进发动起,从而提高速度。这和计算机缓存有着异曲同工之妙,好好利用,就相当于,你比别人跑得更
6、个程序:viewplaincopytoclipboardprint?1#include2char*hello="hello";3char*__=",";1intmain()2{3char*world="world";4printf("%s%s%s",hello,__,world);5return0;6}我们都知道这个程序输hello,world,对了!我们却不知道字符串hello,字符串__,字符串world是不是在一个位置,如果你觉得,不必关心这些了,反正程序已经达到了效果,那么请你离开这个网页,不要浪费你的时间。回到计算机上来,我们要让计算机发挥最大的性能,就
7、必须也要像“了解汽车内部结构的工程师”一样的了解计算机,我时常赞叹计算机设计的优美。为了加快访问的速度,我们加入了缓存,缓存的加入,就像我们在超高速行驶汽车时,再优秀的发动机也不能完全燃烧汽油,而且速度越高,会由于空气的不足,导致汽油燃烧不尽,从而成了汽车提速的瓶颈,然后,我们在汽车的身上再多开几个洞(这就是你为什么见到豪华跑车身上都有几个洞),把空气压缩进发动起,从而提高速度。这和计算机缓存有着异曲同工之妙,好好利用,就相当于,你比别人跑得更
此文档下载收益归作者所有