你的for循环真的高效吗——优化for循环第一章
2011-06-03 12:45
190 查看
在我们所写的程序中,几乎没有不用到for循环的,但是,对于for循环,很多人确实效率很低的,包括我看得很多代码,for循环的执行效率非常低,下面我就举个例子来说明:
view plaincopy to clipboardprint?
#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);
}
#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,所以,我们要再加一个变量,比如下边所看到的,
view plaincopy to clipboardprint?
#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);
}
#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很大时,我就不说了。
再看这个例子:
view plaincopy to clipboardprint?
#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);
}
#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个周期,但是,如果更多呢?呵呵!
我们可以这样该我们的程序;
view plaincopy to clipboardprint?
#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)
}
#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)
}
这样的效率就得到了很大改善!
结束话:故天将大任于斯人也,必先苦其心志,劳其筋骨,饿其体肤,空乏其身,行拂乱其所为,所以动心忍性,增益己所不能!——孟子
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/zhengzhoudaxue2/archive/2011/05/29/6453366.aspx
view plaincopy to clipboardprint?
#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);
}
#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,所以,我们要再加一个变量,比如下边所看到的,
view plaincopy to clipboardprint?
#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);
}
#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很大时,我就不说了。
再看这个例子:
view plaincopy to clipboardprint?
#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);
}
#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个周期,但是,如果更多呢?呵呵!
我们可以这样该我们的程序;
view plaincopy to clipboardprint?
#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)
}
#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)
}
这样的效率就得到了很大改善!
结束话:故天将大任于斯人也,必先苦其心志,劳其筋骨,饿其体肤,空乏其身,行拂乱其所为,所以动心忍性,增益己所不能!——孟子
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/zhengzhoudaxue2/archive/2011/05/29/6453366.aspx
相关文章推荐
- 你的for循环真的高效吗——优化for循环第一章
- 你的for循环真的高效吗——优化for循环第一章
- Java高效编码:for-each循环优先于传统的for循环
- 高效的for循环
- 第一章 基本语法-6循环(for)练习 求一个数的所有约数
- For-each循环优于for循环感悟
- android 对for循环进行优化
- for循环嵌套 简单优化
- 对FOR循环优化心得
- for循环优化策略
- Matlab的for循环优化
- for 循环性能比较 提高for循环的效率
- 关于for循环中,不同时机return 时,for循环的执行情况
- 增强型for循环,与for循环在代码上的差别!
- Effective Java 之-----for-each循环优于传统的for循环
- 增强for循环和for循环的区别
- C语言深度解剖之——编译器的bug、for循环优化
- Effective JavaScript Item 49 对于数组遍历,优先使用for循环,而不是for..in循环
- 对FOR循环优化心得
- Pythone:基本功之for循环和while循环,通透理解for循环,走遍天下都不怕