C代码优化案例

 

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

 

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

 

(2)while循环和dowhile循环

 

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

 

unsigned int i;

 

    i=0;

    while (i<1000)

    {

         i++;

        //用户程序

    }

 

或:

 

unsigned int i;

 i=1000;

 

do

 {

      i--;

     //用户程序

 }

 while (i>0);

 

在这两种循环中,使用dowhile循环编译后生成的代码的长度短于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 eax1

 

test eaxeax

 

je foo+23h

 

jmp foo+18h

 

编译前:

 

for (;;)

 

编译后:

 

jmp foo+23h

 

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

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值