C语言代码优化

来源:互联网 发布:文明6 mac下载 编辑:程序博客网 时间:2024/04/30 10:28

(1)Switch语句中根据发生频率来进行case排序

 

Switch 可能转化成多种不同算法的代码。其中最常见的是跳转表和比较链/树。当switch用比较链的方式转化时,编译器会产生if-else-if的嵌套代码,并按照顺序进行比较,匹配时就跳转到满足条件的语句执行。所以可以对case的值依照发生的可能性进行排序,把最有可能的放在第一位,这样可以提高性能。此外,在case中推荐使用小的连续的整数,因为在这种情况下,所有的编译器都可以把switch 转化成跳转表。

 

(2)while循环和do…while循环

 

用while循环时有以下两种循环形式:

 

unsigned int i;

 

    i=0;

    while (i<1000)

    {

         i++;

        //用户程序

    }

 

或:

 

unsigned int i;

 i=1000;

 

do

 {

      i--;

     //用户程序

 }

 while (i>0);

 

在这两种循环中,使用do…while循环编译后生成的代码的长度短于while循环。

 

(3)提升循环的性能

 

 

要提升循环的性能,减少多余的常量计算非常有用(比如,不随循环变化的计算)。

 

不好的代码(在for()中包含不变的if()):

 

for( i 。。。 )

 {

      if( CONSTANT0 )

     {

            DoWork0( i ); // 假设这里不改变CONSTANT0的值

      }

      else

      {

            DoWork1( i ); // 假设这里不改变CONSTANT0的值

      }

 }

 

推荐的代码:

 

if( CONSTANT0 )

 {

     for( i 。。。 )

     {

          DoWork0( i );

      }

 }

 else

 {

      for( i 。。。 )

      {

            DoWork1( i );

      }

 }

 

如果已经知道if()的值,这样可以避免重复计算。虽然不好的代码中的分支可以简单地预测,但是由于推荐的代码在进入循环前分支已经确定,就可以减少对分支预测的依赖。

 

 

(4)选择好的无限循环

 

在编程中,我们常常需要用到无限循环,常用的两种方法是while (1) 和 for (;;)。这两种方法效果完全一样,但那一种更好呢?然我们看看它们编译后的代码:

 

编译前:

 

while (1);

 

编译后:

 

mov eax,1

 

test eax,eax

 

je foo+23h

 

jmp foo+18h

 

编译前:

 

for (;;);

 

编译后:

 

jmp foo+23h

 

显然,for (;;)指令少,不占用寄存器,而且没有判断、跳转,比while (1)好。

原创粉丝点击