您的位置:控制工程论坛网论坛 » 自动化软件 » 书写高效易懂C代码之技巧

zhiy66

zhiy66   |   当前状态:在线

总积分:6528  2025年可用积分:0

注册时间: 2007-12-18

最后登录时间: 2012-01-11

空间 发短消息加为好友

书写高效易懂C代码之技巧

zhiy66  发表于 2008/12/11 21:18:00      594 查看 0 回复  [上一主题]  [下一主题]

手机阅读

一位优秀的程序员应该时刻注意两点:
1.写高效的代码,
2.写易懂的代码.
这两点同样重要,书写代码的过程中应当时刻注意.当两者发生冲突时应该考虑在该代码片段谁更重要,择其重者而从之.
以下我将记录一些与此话题相关的例子.
1. switch 语句中,应该将经常出现的case放在前面,将不常出现的case放在后面.从面提高效率.
比如,在处理窗口消息的函数中,WM_CREATE, WM_DESTROY,等在整个进程活动周期中只被调用一次,故应该放在switch的最后.
当然,同样也适用于if判断的情形.
2. for循环语句的结束条件尽可能的简单.考虑下面这个例子:
              Status=NDIS_STATUS_UNSUPPORTED_MEDIA;
              for (i=0; i<MediumArraySize &&; i++) {
                  if (MediumArray == NdisMedium802_3) {
                      *SelectedMediumIndex = i;
                      Status=NDIS_STATUS_SUCCESS;
                  } /* endif */
   
              }
每循环一次,程序都要判断 Status!=NDIS_STATUS_SUCCESS 是否满足,就是说,如果这个循环要执行1000次,CPU就要多执行1000个判断语句.而这个C语句应该需要2条汇编才能完成. 如果改成以下代码情形就大不一样了.
              Status=NDIS_STATUS_SUCCESS;
              for (i=0; i<MediumArraySize &&; i++) {
                  if (MediumArray == NdisMedium802_3) {
                      *SelectedMediumIndex = i;
                      break;
                  } /* endif */
   
              }
          if( i==MediumArraySize ) Status=NDIS_STATUS_UNSUPPORTED_MEDIA;
3.优化代码,尽量不要用乘除求余等语句,因为这种语句一条就需要若干条汇编指令,效率很低。常用的做法有:
乘以2的倍数可以用左移来替代,除以2的倍数可以用右移来替代。对2的倍数减1求余用2的倍数求与替代。
a*8  ==    a<<3        a/8  ==  a>>3          a%7  ==  a
1楼 0 0 回复