bluelucky 发表于 2007-9-26 00:00:59

优化C语言代码的一点心得

我最近在优化一个C函数时,有一些新的心得, 主要是两条,希望能和大家分享一下
1. 善用register关键字
register 的意思就是让编译器尝试把该行声时的局部变量放到寄存器中而不是栈中
我发现ADS的Thumb C编译器对局部变量是否带有"register"关键字很敏感(AVR的GCC不甚敏感)
这是我在为240x128液晶写一个位图拷贝函数(BitBlt)时发现的.
我在尝试优化代码的过程中发现,如果把内循环中常用的变量以register修饰,
执行时间甚至能降到以前的60%.
但是如果把一些不常用的变量加上register, 可能效果适得其反,执行时间能会增多
如果把太多变量都加以register( Thumb只能使用8个), 也会导致register效果消失,
至于性能是提高还是下降就看你人品了.
看来好钢不多, 得使在刀刃上才行
如果把这个函数编译成32位的ARM码,应会更快些吧,只不过ADS缺省把.C源程序编译
成Thumb目标码,不知道该怎么样设置,ADS才会把它编译成ARM目标码
2. 查表
   我在那个BitBlt函数中,经常要用到位旗标,像 1<<0, 1<<1 ... 1<<7.还有
~(1<<0), ~(1<<1) ... ~(1<<7).我把它们做到两个数组中, 用查表而不是使用
<<和~运算符,速度又快了15%左右
3. 把条件表达式写得简单些
   我有一个条件表达式是
        bitSrc++;
        if ( (bitSrc & 5)== 0)
        {
                //几行代码
                bitSrc=0;
        }
后来改写为
        bitSrc++;
        bitSrc&=7;
        if ( !bitSrc)
        {
                //几行代码
        }
结果发现又快了一些, 尤其是移植到AVR后,时间降低了30%左右

mimipbr 发表于 2007-12-31 17:50:15

if ( !(bitSrc & 5))
      {
                //几行代码
                bitSrc=0;
      }

这样应该还好些吧!

andydriver 发表于 2008-1-4 16:05:32

同意第1条
后面的应该是看编译器的,不同的编译器效果不同

Shi_Tou 发表于 2010-11-25 15:38:18

心得啊!

steven_sd 发表于 2011-1-27 16:38:06

不错不错

zhoujiewen 发表于 2011-9-17 18:55:26

学习了!!!

aprogramer 发表于 2011-9-17 20:56:50

建议,与 常量的 逻辑比较中,将常量放在 左侧
页: [1]
查看完整版本: 优化C语言代码的一点心得