在实现功能的情况下,工程师下一步需要开始的工作就是优化代码质量。软件代码的质量对于产品系统有很大的帮助提高。优化代码尺寸和效率的同事,还可以达到降低功耗的效果。对于优化代码,有许多种渠道,对于不同的应用有不同的解决之道。通常情况下,同一种优化方式在不同的应用中达到的效果是不同的。为了对某一特定应用有质量最好的代码,我们需要运用多种优化方式结合使用,并且在不断的实验过程中达到最优。
下面介绍几种常见的优化方法:
调整编译器的选项
在 ARM 编译器中提供了 2 组优化选项可以供工程师选择。一组是优化等级,有 O0~03 四个等级,数字越大, 优化等级越高。另一组规定了优化的方向,-Ospace –Otime,让工程师来规范编译器优化的具体方向。另外, 指定合适的 CPU 类型也会使代码得到优化。
考虑系统中内存的使用方式
高级别的 ARM 架构都包含有 MMU 和二级 cache。开启内存管理器可以大大提高 CPU 访问内存数据的效率,而合 理使用 cache 可以减少 CPU 等待读取数据的时间。
设置合理的循环体 倒数归零的计数方式将比增加计数每循环一次节省一个比较指令周期。
在需要时适当展开循环体也可以减少 循环次数。因为每次循环都需要有计数器变更,比较计数是否达到循环终止条件等。设置合理的嵌套循环体, 将循环次数多的作为内循环也是提高循环效率的方法之一。
内存对齐
ARM是32位处理器,因此四字节运算将得到最有效的执行。在创建结构体以及编写函数传递参数时,考虑对齐会使占用的内存尽可能少。
使用 profiler 工具,找到程序的瓶颈
ARM profiler 工具提供了一个很简单的方式就可以找到程序指令层次和函数层次的瓶颈在哪里。Profiler根据程序在运行时得到的实际数据为依据进行数据分析,为之后的代码覆盖率,代码优化性以及性能表现提供分析数据。
使用协处理器指令
在ARM v6及v7架构,可以使用VFP和SIMD指令集来提高处理器的计算能力。尤其是在 Cortex-A 架构中新增的高级SIMD指令——NEON指令集可以提高处理器执行效率达4倍以上。
下面介绍几种常见的优化方法:
调整编译器的选项
在 ARM 编译器中提供了 2 组优化选项可以供工程师选择。一组是优化等级,有 O0~03 四个等级,数字越大, 优化等级越高。另一组规定了优化的方向,-Ospace –Otime,让工程师来规范编译器优化的具体方向。另外, 指定合适的 CPU 类型也会使代码得到优化。
考虑系统中内存的使用方式
高级别的 ARM 架构都包含有 MMU 和二级 cache。开启内存管理器可以大大提高 CPU 访问内存数据的效率,而合 理使用 cache 可以减少 CPU 等待读取数据的时间。
设置合理的循环体 倒数归零的计数方式将比增加计数每循环一次节省一个比较指令周期。
在需要时适当展开循环体也可以减少 循环次数。因为每次循环都需要有计数器变更,比较计数是否达到循环终止条件等。设置合理的嵌套循环体, 将循环次数多的作为内循环也是提高循环效率的方法之一。
内存对齐
ARM是32位处理器,因此四字节运算将得到最有效的执行。在创建结构体以及编写函数传递参数时,考虑对齐会使占用的内存尽可能少。
使用 profiler 工具,找到程序的瓶颈
ARM profiler 工具提供了一个很简单的方式就可以找到程序指令层次和函数层次的瓶颈在哪里。Profiler根据程序在运行时得到的实际数据为依据进行数据分析,为之后的代码覆盖率,代码优化性以及性能表现提供分析数据。
使用协处理器指令
在ARM v6及v7架构,可以使用VFP和SIMD指令集来提高处理器的计算能力。尤其是在 Cortex-A 架构中新增的高级SIMD指令——NEON指令集可以提高处理器执行效率达4倍以上。