嵌入式系统编程中的代码优化

http://tech.ddvip.com   2007年09月25日    社区交流

内容摘要:嵌入式系统一般指非PC系统,通常完成一种或多种特定的计算机功能。它是以应用为中心,软硬件可裁减的,适应应用系统对功能,可靠性,成本,体积,功耗等综合性要求的专用计算机系统。

  比算法优化层低一级的是数据优化层,我们可以通过改变算法使用的数据类型来优化算法。主要的目的是使处理的数据和目标结构的特性相一致。这项优化不需要大量的代码重写,并独立于算法优化的执行而执行.例如:

  确定浮点型变量和表达式是 float 型

  为了让编译器产生更好的代码,必须确定浮点型变量和表达式是 float 型的。要特别注意的是,以 ";F"; 或 ";f"; 为后缀(比如:2.718f)的浮点常量才是 float 型,否则默认是 double 型。为了避免 float 型参数自动转化为 double,请在函数声明时使用 float。

  使用32位的数据类型

  编译器有很多种,但它们都包含的典型的32位类型是:int,signed,signed int,unsigned,unsigned int,long,signed long,long int,signed long int,unsigned long,unsigned long int。尽量使用32位的数据类型,因为它们比16位的数据甚至8位的数据更有效率。

  明智使用有符号整型变量

  在很多情况下,你需要考虑整型变量是有符号还是无符号类型的。在许多地方,考虑是否使用有符号的变量是必要的。在一些情况下,有符号的运算比较快;但在一些情况下却相反。 比如:整型到浮点转化时,使用大于16位的有符号整型比较快。因为x86构架中提供了从有符号整型转化到浮点型的指令,但没有提供从无符号整型转化到浮点的指令。在整数运算中计算商和余数时,使用无符号类型比较快。

  Instruction flow optimization指令流优化

  第三层优化的目标是低级指令流。比较常见的技术是循环合并(loop merging),循环展开(unrolling),软件流水(software pipelining)。

  循环合并

  如果两个循环计数差不多、循环执行互不相同的操作,可以把它们合并在一起组成一个循环。当两个循环的负荷都不满时,这是非常有用的。

  循环展开

  循环展开就是把循环计数小的循环展开,成为非循环形式的串行程序,或者把循环计数大的循环部分展开,减少循环迭代次数,这样可以节省了用于循环设置、初始化、增加和校对循环计数器的时间。大多数编译器可以自动完成这项工作,手工编译会出现错例如:

  for( int i = 0; i < 3; i++ ) array[i] = i;

  逻辑上等同于:

  array[0] = 0; array[1] = 1, array[2] = 2;

  软件流水

  软件流水是用来安排循环指令,使这个循环多次迭代并行执行的一种技术。在嵌套循环中,编译器仅对最里面的循环执行软件流水,因此对执行周期很少的内循环作循环展开,外循环进行软件流水,这样可以改进C代码并行执行的性能。使用软件流水还应当注意:尽管软件流水循环可以包含内联函数,但是不能包含函数调用;在循环中不可以有条件终止指令;在循环体中不可以修改循环控制变量。

  3、总结语

  现代的C和C++编译器都提供了一定程度上的代码优化。然而,大部分由编译器执行的优化仅涉及执行速度和代码大小的一个平衡。你的程序能够变得更快或者更小,但是不可能又变快又变小。上面介绍的方法主要是为了提高代码的效率。但是事实上,在使用这些技术提高代码运行速度的同时会相应的产生一些负面的影响,比如增加代码的大小、降低程序可读性等。不过你可以让C/C++编 译器来进行减少代码大小的优化,而手动利用编程来减少代码的执行时间。在嵌入式程序设计中合理地使用这几种技术有时会达到很好 的优化效果。

责编:豆豆技术应用

正在加载评论...