查看: 589|回复: 0

[经验] C600编程中语句的优化案例

[复制链接]

该用户从未签到

发表于 2021-3-2 09:30:58 | 显示全部楼层 |阅读模式
分享到:
、if...else...语句的优化
(一)

1、源代码:

  1. <span microsoft="" yahei";"="">if (sub(ltpg, LTP_GAIN_THR1) <= 0)//ltpg</span><ltp_gain_thr1时进入,如果ltpg microsoft="" yahei";"="">LTP_GAIN_THR1,则adapt=1
  2. {
  3.         adapt = 0;
  4. }
  5. else
  6. {
  7.         if (sub(ltpg, LTP_GAIN_THR2) <= 0)
  8.         {
  9.                                         adapt = 1;
  10.         }
  11. }
  12. else
  13. {
  14.         adapt = 2;
  15. }</ltp_gain_thr1时进入,如果ltpg>
复制代码

2、改编后的代码:
adapt = (ltpg > LTP_GAIN_THR1) + (ltpg > LTP_GAIN_THR2);
(二)
1、源代码:
  1. if (adapt == 0)
  2. {
  3.         if (filt > 5443)
  4.         {
  5.                 result = 0;
  6.         }
  7.         else
  8.         {
  9.                 if (filt < 0)
  10.                 {
  11.                         result = 16384;
  12.                 }
  13.                 else
  14.                 {
  15.                         filt = _sshl(filt, 18) >> 16; // Q15
  16.                         result = _ssub(16384, _smpy(24660, filt) >> 16);
  17.                 }
  18.         }
  19. }
  20. else
  21. {
  22.         result = 0;
  23. }
复制代码

2、改编后的代码:
filt1 = _sshl(filt, 18) >> 16;
tmp = _smpy(24660, filt1) >> 16;
result = _ssub(16384, tmp * (filt >= 0));//filt<0则result = 16384;
result = result * (!((adapt != 0) || (filt > 5443)));//最巧妙的是,将if...else...融入表达式,adapt!=0和filt>5443任意一个条件成立result就等于0
(三)

1、源代码:
  1. static Word16 saturate(Word32 L_var1)
  2. {
  3.         Word16 swOut;

  4.         if (L_var1 > SW_MAX)
  5.         {
  6.                 swOut = SW_MAX;
  7.                 giOverflow = 1;
  8.         }
  9.         else if (L_var1 < SW_MIN)
  10.         {
  11.                 swOut = SW_MIN;
  12.                 giOverflow = 1;
  13.         }
  14.         else
  15.                 swOut = (Word16)L_var1;    /* automatic type conversion */
  16.         return (swOut);
  17. }
复制代码

2、改编后的代码:
  1. static inline Word32 L_shl(Word32 a, Word16 b)
  2. {
  3.         return ((Word32)((b) < 0 ? (Word32)(a) >> (-(b)) : _sshl((a), (b))));
  4. }
复制代码

3、优化方法说明:
        如果在循环中出现if...else...语句,由于if...else...语句中有跳转指令,而每个跳转指令有5个延迟间隙,因此程序执行时间延长;另外,循环内跳转也使软件流水受到阻塞。直接使用逻辑判断语句可以去除不必要的跳转。例如在例1的源代码最多有两次跳转,而改编后不存在跳转。例2和例3同样也去掉了跳转。

技巧:
        尽可能地用逻辑判断语句替代if...else...语句,减少跳转语句。
回复

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /4 下一条



手机版|小黑屋|与非网

GMT+8, 2024-11-25 01:26 , Processed in 0.109938 second(s), 15 queries , MemCache On.

ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

苏公网安备 32059002001037号

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.