打印

程序优化小结

[复制链接]
1596|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
txcy|  楼主 | 2010-10-28 14:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近做了一个简单的程序优化,简单共享一下相关经验

程序优化一般分为三个阶段:

1、直接按照需要用C语言实现功能。
2、C语言级的优化。
3、汇编级的优化。将C程序中优化效率较低的部分提出来,用线性汇编语言编写,利用汇编优化器进行优化。

感觉第三个阶段是最难的

相关帖子

沙发
X-Hawk| | 2010-10-28 15:00 | 只看该作者
第3步是难,感觉一般人的智商,优化不过ARM的编译器。
那可是优化专家+机器计算共同的结果。

使用特权

评论回复
板凳
FVJFIFE| | 2010-10-28 20:29 | 只看该作者
具体怎么优化啊,还请楼主指教

使用特权

评论回复
地板
gxgclg| | 2010-10-28 22:26 | 只看该作者
这个应该是实践出真知

使用特权

评论回复
5
米其林r| | 2010-10-29 18:11 | 只看该作者
优化还是挺难得,不怎么会

使用特权

评论回复
6
老鱼探戈| | 2010-10-29 18:13 | 只看该作者
只要汇编和C都通就可以了。。

使用特权

评论回复
7
huzixian| | 2010-10-31 11:11 | 只看该作者
1.1 通用的优化方法
(1)减小运算强度

利用左/ 右移位操作代替乘/ 除2 运算:通常需要乘以或除以2 的幂次方都可以通过左移或右移n 位来完成。实际上乘以任何一个整数都可以用移位和加法来代替乘法。ARM 7 中加法和移位可以通过一条指令来完成,且执行时间少于乘法指令。例如: i = i × 5 可以用i = (i<<2) + i 来代替。
利用乘法代替乘方运算:ARM7 核中内建有32 ×8 乘法器, 因此可以通过乘法运算来代替乘方运算以节约乘方函数调用的开销。例如: i = pow(i, 3.0) 可用 i = i×i × i 来代替。
利用与运算代替求余运算:有时可以通过用与(AND )指令代替求余操作(% )来提高效率。例如:i = i % 8 可以用 i = i & 0x07 来代替。
(2)优化循环终止条件
    在一个循环结构中,循环的终止条件将严重影响着循环的效率,再加上ARM 指令的条件执行特性,所以在书写循环的终止条件时应尽量使用count-down-to-zero结构。这样编译器可以用一条BNE (若非零则跳转)指令代替CMP (比较)和BLE (若小于则跳转)两条指令,既减小代码尺寸,又加快了运行速度。

(3)使用inline 函数
   ARM C 支持 inline 关键字,如果一个函数被设计成一个inline 函数,那么在调用它的地方将会用函数体来替代函数调用语句, 这样将会彻底省去函数调用的开销。使用inline 的最大缺点是函数在被频繁调用时,代码量将增大。

(2)使用寄存器变量
    CPU 对寄存器的存取要比对内存的存取快得多, 因此为变量分配一个寄存器, 将有助于代码的优化和运行效率的提高。整型、指针、浮点等类型的变量都可以分配寄存器; 一个结构的部分或者全部也可以分配寄存器。给循环体中需要频繁访问的变量分配寄存器也能在
一定程度上提高程序效率。

1)避免除法
    ARM 7 指令集中没有除法指令,其除法是通过调用C 库函数实现的。一个32 位的除法通常需要20~140 个时钟周期。因此, 除法成了一个程序效率的瓶颈, 应尽量避免使用。有些除法可用乘法代替,例如: if ( (x / y) > z)可变通为 if ( x > (y × z)) 。在能满足精度,且存储器空间
冗余的情况下, 也可考虑使用查表法代替除法。当除数为2 的幂次方时, 应用移位操作代替除法。

(2)利用条件执行
    ARM 指令集的一个重要特征就是所有的指令均可包含一个可选的条件码。当程序状态寄存器(PSR )中的条件码标志满足指定条件时, 带条件码的指令才能执行。利用条件执行通常可以省去单独的判断指令,因而可以减小代码尺寸并提高程序效率。



(3)使用合适的变量类型
    ARM 指令集支持有符号/ 无符号的8 位、16 位、32位整型及浮点型变量。恰当的使用变量的类型,不仅可以节省代码,并且可以提高代码运行效率。应该尽可能地避免使用char、short 型的局部变量,因为操作8 位/16 位局部变量往往比操作3 2 位变量需要更多指令,

虽然一条LDM/STM 指令能代替多条LDR/STR 指令,但这并不意味着程序运行速度得到了提高。实际上处理器在执行LDM/STM 指令的时候还是将它拆分成多条单独的LDR/STR 指令来执行

Thumb 是ARM 体系结构的扩充。Thumb 指令集是大多数常用32 位ARM 指令压缩成16 位宽指令的集合。在执行时,16 位指令透明的实时解压成32 位ARM 指令并没有性能损失。而且程序在Thumb状态和ARM 状态之间切换是零开销的。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

274

主题

2106

帖子

0

粉丝