滴水逆向联盟

标题: 怎样提高循环语句的效率 [打印本页]

作者: 夺命书生    时间: 2014-11-7 16:20
标题: 怎样提高循环语句的效率
本帖最后由 夺命书生 于 2014-11-7 18:52 编辑

在C语言程序中,常常使用循环结构来解决特定的问题,那么在设计程序的时候,如何才能提高循环语句的效率呢?
C语言循环语句中,for 语句使用频率最高,while 语句其次,do 语句比较少用。

提高循环语句效率的基本方法是,降低循环体的复杂性,先说说几种提高循环效率的情况。

一. 直接提高循环语句的效率

1.在多重循环中如果有可能,应该将最长的循环放在最内层,最短的循环放在最外层,
    以减少CPU 切换循环层的次数,例如下面的两种写法。

写法一(长的循环在外层)
  1. for(i=0;i<100;i++)
  2.         {
  3.                 for(k=0;k<10;k++)
  4.                 {
  5.                         sum=sum +a[i][k];
  6.                 }
  7.         }
复制代码
写法二(长的循环在内层)
  1.         for(k=0;k<10;k++)
  2.         {
  3.                 for(i=0;i<100;i++)
  4.                 {
  5.                         sum=sum +a[i][k];
  6.                 }
  7.         }
复制代码


2.如果在循环体内,再做逻辑判断,并且循环次数较大,应该将逻辑判断移到循环体的外面。

写法一(效率低但程序简洁)
  1.         for(i=0;N<10;i++)
  2.         {
  3.                 if(condition)
  4.                 {
  5.                         dosomething();
  6.                 }
  7.                 else
  8.                 {
  9.                         dosomething();
  10.                 }        
  11.         }
复制代码
写法二(效率高但程序不简洁易读)
  1. if(condition)
  2.         {
  3.                 for(i=0;N<10;i++)
  4.                 {
  5.                         dosomething();
  6.                 }
  7.         }
  8.         else
  9.         {
  10.                 for(i=0;N<10;i++)
  11.                 {
  12.                         dosomething();
  13.                 }
  14.         }        
复制代码
写法一比写法二多执行了N-1次逻辑判断,并且由于写法一每次循环都要进行逻辑判断,打断了循环模式,
使得编译器不能对循环进行优化处理,降低了效率。
如果N 的量非常大,最好采用第二种写法,可以提高效率,如果 N 的量非常小,两者效率差别不明显,
采用写法一比较好,代码简洁易读。

二. 简洁提高循环语句的效率

1.对于简单的,if...else 语句,建议使用C语言的三目运算符,“ ?:” 代替,以提高程序的执行效率。

  1.         if(i<20)
  2.         {
  3.                 a=1;
  4.         }
  5.         else
  6.         {
  7.                 a=1;
  8.         }
复制代码
可以写成
  1. a=(i<20)?1:6
复制代码

2.在程序中不允许出现一下风格

  1.         if(i<20)
  2.                 return a;
  3.         return b;
复制代码
应该写成
  1.         if(i<20)
  2.         {
  3.                 return a;
  4.         }
  5.         else
  6.         {
  7.                 return b;
  8.         }
复制代码

3.对于 switch 语句,在每个 case 的后面不要忘记加 break , 除非你想某几个分支重叠。

4.switch 语句,一定要有 default ,既使它不做什么。


作者: OneTime    时间: 2014-11-7 21:12
从来没有研究过介个问题哦,我去试试去!
作者: 夺命书生    时间: 2014-11-7 21:35
OneTime 发表于 2014-11-7 21:12
从来没有研究过介个问题哦,我去试试去!

这都没试过,你写啥代码?




欢迎光临 滴水逆向联盟 (http://dtdebug.com/) Powered by Discuz! X3.2