代码优化

软件中的所有的代码并不是都值得去优化。我们需要将优化的重点放在那些可以最大程度地减少执行时间的代码。因此,通常需要分析应用程序中各种任务的执行时间。

以下的技术通常可以显著提高程序的性能,尤其是在编译器无法有效使用系统资源的情况下。

减少冗余操作

仔细的编码是产生紧凑代码的关键。在不影响功能的情况下,可以通过仔细检查代码来减少或消除代码中的多余操作。

数据类型优化

为程序的关键路径选择合适的数据类型对程序的性能优化至关重要。直接从任务定义中得出的数据类型可能无法为各种功能单元带来最佳性能。例如,在大多数的DCT和IDCT 算法中,使用比例缩放的浮点常量并将预计算的常量分配给寄存器的方式比直接使用整数和浮点变量的混合模式(定义好的)具有更好的性能。在某些情况下——例如量化或引入存储在寄存器中的临时变量,可以显著提高程序的性能。

循环展开

循环展开是循环的变换,循环展开会使得循环体的代码量变得更大,但是循环的迭代次数也因此而变的更少。除了编译器自动优化之外,还经常需要手动循环展开以确保正确的展开量,因为过度展开可能会对性能产生不利影响。通过更有效地使用CPU寄存器,循环展开过程可以最大化地减少加载/存储指令的数量、以及编译器效率低下的指令调度所引起的数据危害。循环展开有两种类型:内部和外部。内部展开包括将最内层循环的某些迭代折叠成更大,更复杂的语句。这些语句需要更多的机器指令,但是可以由编译器的优化器更有效地调度。外部循环展开包括使用更多的寄存器把迭代从外部循环移动到内部循环中,以最大程度地减少访问存储器的次数。在视频编码应用中,运动估计和运动补偿预测就是循环展开的良好选择。

算术运算优化

除法和乘法通常被认为是最耗时的运算。但是,在大多数RISC处理器中,就指令执行延迟和指令吞吐量而言,基于32位的乘法比基于64位的乘法需要更多的时钟周期。此外,与混合整数和浮点除法相比,浮点除法的循环开销会更小。因此,减少使用这些算术运算——尤其是在循环内部对于提升程序性能而言至关重要。

Last updated