1.前言
对一个程序来说,内存和负载是两个重点指标。特别是对嵌入式程序来说,本身单片机的主频小,内存少,这就要求 开发工作者必须考虑如何在有限的内存和负载下开展工作。本文主要侧重负载优化。首先介绍负载的概念,其次接收负载优化的理论和思想,最后介绍一些可行的方法。
2.负载优化理论
一个程序执行的时间,我们用cycle表示。cycle就是”循环,圈“的意思,当用cycle表示程序负载时,cycle就是指的时钟周期,就是主频震荡一次的时间。
我们常说”一个程序执行了多少cycle”指的就是这个程序执行了多少时钟周期。
计算机领域有一个经典公式,一个程序的执行时间 = 这个程序的所需的指令数执行一条指令所需要的cycle数1个cycle所需要的时间。
该公式可以分为三部分:
A:一个程序越大,,写的逻辑越复杂,那么执行它需要的需要的指令就越多,即Instructions就越大。
B: 这部分指的是执行一条指令所需的平均cycle数(有的指令执行时间长,有的指令执行时间短,因此这里取平均概念)。
C: 主频的倒数,即时钟周期。
从上述公式就可以看出,要想减少 运行一段程序所需要的CPU执行时间,就可以从三大处着手。
其中,C与硬件相关,软件改动不了。一个更大主频的CPU,价钱也更贵。
对软件层面来说,只能从A和B两方面着手了。
从B的角度看,减少一个指令所需要的时钟周期。可以采用的方法是:指令流水线(指令并行执行,减少一批指令总的时钟周期数,并不是真正意义上减少一条指令所需要的时钟周期)。针对自研核,可以设置一些专有指令,来处理某些运算时,比常规指令更快。另外从指令执行周期角度上,可以进一步分析。
一条指令从内存加载到CPU执行,经历三个步骤。取指,译码和执行。
取值是根据程序计数器PC(存放了将要执行的指令的地址),到内存中取出将要执行的指令(精简指令集比复杂指令集好处就在于指令定长,取指的时候方便快捷;另外,结构体对齐,其中一个目的也是为了取数方便,虽然牺牲了一点空间)。不管是从内存中取值,还是取数据(在冯诺依曼机中,执行和数据都在内存中存储,是靠不同的指令周期来区分从内存中取到的是指令还是数据的。取值周期取到的是指令,执行周期取到的是数据)
这个过程中的优化,很多工作是在cache中完成的。因此,要金少B的时间,就要考虑更好地利用cache.如,1.增加cache,成本也增大了。2.提高cache命中率,这非常关键。
从A的角度看,就要提升程序员的自我修养,用更简洁的程序来写出更高效的代码。这里体现了我们讲数据结构和算法的重要性。
3.一些负载优化方法
后续更新~