系统优化法则

系统优化法则
2010年11月13日
  系统优化法则
  1)对齐法则
  存取一个字长的数据与一个字节的数据那个耗时更短?
  c/c++程序员都知道有一个对齐原则,在32位的cpu中,要四字节对齐,为什么呢?因为在大多数32位的cpu中,与存取一个字长的数据相比,存取一个字节要做更多的工作,因为cpu硬件逻辑一次只能处理一个字长的数据,如果要处理比一个字长小的数据的话,直接写是不行的,你不能为了写一个字节的数据就把同字长的其它字节数据给冲了,即然硬件不支持,就要来软的。打个比方,向内存中写一个字节,先要把这个字节所在的字长的数据读到通用寄存器中,然后再经过移位,与非等操作修改把通用寄存器,最后再写回到内存中去,这样操作一个字节就经历了读改存三大步骤,如果是写一个字长的数据就好办了,直接向内存中写就好了。
  依此类推,如果你要操作的不是内存,而是flash等其它介质,最好也能尊守这个对齐原则,flash只能整而整块的操作,最要命的是flash在写之前要擦除,而且只能整页整块的擦,那怕你只是需要一个字节,也要操整整一页或一块的数据。大多数程序员不会接触到flash的操作,因为在操作系统中,文件系统和驱动会包办这件事,但一些嵌入式程序员和驱动工程师要了解这些,特别是那些设计文件系统的高手,这更是常识了。
  还是回到传统意义的对齐这个话题,其它大多数编译器会帮你做对齐这做事,但要注意,只是可能帮你做,而不是一定会帮你做,而且有时会帮倒忙。进程间交互的一些协义数据,特别是与网络有关的数据,不仅要注意大小端的问题,对齐的问题也很关键,建议在设计协义之前,就把对齐问题考虑进去,这样不仅是为了减少误对齐的错误,还能提高一点点效率。
  2)尽量保证cache能命中
  下面是一段很有名的代码:
  代码一:
  int cache[200][300];
  for(int i = 0; i read(cache[i][j]);
  }
  代码二:
  for(int j = 0; j read(cache[i][j]);
  }
  你认为那段代码的执行效率可能会高。一般CPU中都会有cache,cache说白了就是一段片内的内存,他比外存的存取速度更快,cpu访问外存时,会把当前数据之后的一段也据也放到cache中,这样cpu在取下一个数据时就会直接在cache中去找,如果找到了就直接读出来,这叫命中,找不到就还去外存中读取(末命中)因为判断cache是否命中与从cache中读数据所耗时间大大小于访问外存的时间。
  一般而言,程序员操纵不了cache,cache动作是由硬件完成的,但只要知道cache的工作原理,写出尽量能让cache命中的代码,你的程序会快很多。代码二就有可能每次访存都不能命中cache,都要去访问外存,这样你的代码执行速度就会慢下来。
  3)让最频繁执行的代码放在存取速度最快的ram中
  毫无疑问,如果取址速度能跟得上cpu的速度,那么整个系统的效率将大大提高。但这只是一个美好的愿望,高速的ram代表着更高的成本,又要马儿跑得快,又想马儿不吃草,我们程序员能做到这一点。
  一般一个系统中的存储系统会由几级组成,片内的ram,片外的DDL或ram,片内的虽然快但容量小,我们要提高整个系统的执行效率,就要提高片内ram的使用率。把你系统中运行频率最高的代码放成速度最快的ram中,这是一个不错的选择。例如在一些有LCD的系统中,图形的运算或者是图形数据的搬运是最频繁的操作,如果把这些代码的执行位置放在速度最快的片内RAM中,LCD的显示效果和速度将会有很大的提升,而且这种提升绝对是触目惊心的。至于如何将代码定位在某段ram中,这就属于编译链接的知识了。
  4)不要打断流水线
  流水线在CPU中己不是什么新技术了,一个七级流水线的CPU的处理能力相当于七个同等频率的单级流水线的CPU的处理速度,流水线的技术相当震撼吧,所以不要随随便便的打断它。
  我们的编译器会在这方面有一定的优化,让你的代码编译出来的机器码尽量符合流水线的要求,但没有那一种编译器比人更聪明,如果你有幸写一些汇编的算法,请尽量减小指令相关和数据相关的操作,因为他们会打断流水线,让你的七个CPU只能当一个使。
  5)尽量少和低速设备打交道
  作为饱受排队之苦的中国人,这点很能理解。能不排队就不要去排队,能不访问慢设备就不要去访问,如果一定要访问,也要在一次排队后获得最多的资源,尽量减少排队的次数。当然还有另一条路可以走,就是异步访问,让设备工作结速后再通知你一下,而不用干等着。当然,资源的合理分配也能减少访问低速设备的次数,这才是最重要的。我们都知道,排队买火车票不是因为火车票少,而是因为分配不合理,每年春运中所有的人最后都能买到火车票,只不过你饱受排队之苦,或者付出更大的代价。所以资源分配方法很重要,尽量让你的系统少和慢设备打交道。
  6)用专用的硬件去完成最频繁的操作
  随着IC技术的发展和芯片设计生产成本的降低,用专用能硬件代替软件做运算越来越多的被应用,比如前面提到的图形系统,你再怎么优化,其效能也比不上一款专用的GPU来帮你。图形运算用GPU,数据搬运用DMA,编解码用专用的硬编解码器,把CPU解放出来。这样,你的系统可能就不是以CPU为中心了,而是以数据的流动(数据的存储)为中心,整个系统的速度取决于数据在各种专用处理器之间的流动速度了。
  暂时就想到这些,请添加其它的。
  谢
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值