嵌入式C学习-代码优化tips
一.条件跳转分支(ifelse,switch)的优化-基于CPU的cache流水线分支预测机制
<原因分析>
cache机制是为了提升CPU处理效率,合理发挥CPU性能的机制。cache的流水线深度越深,提升效率的效果越明显(越深的流水线意味着越多的元件,越大的功耗,用空间换时间)。流水线机制虽然通过预取指令可以提升执行效率,但是在某些情况下如果预取指令不能正常执行,则会造成浪费,称为“流水线冒险”。流水线冒险分为:结构冒险(硬件被其他指令占用),数据冒险(当前指令在等待前面指令的执行结果),控制冒险(前面指令的执行结果决定下一步的行为)。其中分支显然会引起控制冒险,为了防止这种情况的发生,CPU会采用分支预测来预测下一条要执行的指令进行缓存,预测分为静态预测(编译期预测)和动态预测(运行期预测),静态预测对于循环结构十分有效,但是对于分支结构默认不处理依然按顺序取指令,针对静态预测这种特性,编写分支结构的代码时,将大概率执行的代码放在靠前的分支,可提高代码的执行效率。
<注意点>
1.只针对有cache流水线机制的CPU,很多嵌入式CPU不存在cache不适用
2.分支预测技术是CPU性能的一项关键技术,随着技术的发展,动态分支预测的准确率可以达到95%。仅通过改写分支顺序的效果并不一定很显著(因为仅影响了静态预测)。