C语言性能优化书籍,C语言性能优化.pdf

C C C C 语言性能优化语言性能优化 使用宏定义使用宏定义 在 C 语言中 宏是产生内嵌代码的唯一方法 对于嵌入式系统而言 为了 能达到性能要求 宏是一种很好的代替函数的方法 写一个 标准 宏 MIN 这个宏输入两个参数并返回较小的一个 错误做法 define MIN A B A B A B 正确做法 define MIN A B A B A B 对于宏 我们需要知道三点 1 宏定义 像 函数 2 宏定义不是函数 因而需要括上所有 参数 3 宏定义可能产生副作用 下面的代码 least MIN p b 将被替换为 p b p b 发生的事情无法预料 因而不要给宏定义传入有副作用的 参数 使用寄存器变量使用寄存器变量 当对一个变量频繁被读写时 需要反复访问内存 从而花费大量的存取时间 为此 C 语言提供了一种变量 即寄存器变量 这种变量存放在 CPU 的寄存器 中 使用时 不需要访问内存 而直接从寄存器中读写 从而提高效率 寄存器 变量的说明符是 register 对于循环次数较多的循环控制变量及循环体内反复使 用的变量均可定义为寄存器变量 而循环计数是应用寄存器变量的最好候选者 1 只有局部自动变量和形参才可以定义为寄存器变量 因为寄存器变量属 于动态存储方式 凡需要采用静态存储方式的量都不能定义为寄存器变量 包括 模块间全局变量 模块内全局变量 局部 static 变量 2 register 是一个 建议 型关键字 意指程序建议该变量放在寄存器中 但 最终该变量可能因为条件不满足并未成为寄存器变量 而是被放在了存储器中 但编译器中并不报错 在 C 语言中有另一个 建议 型关键字 inline 下面是一个采用寄存器变量的例子 1 求 1 2 3 n 的值 2 WORD Addition BYTE n 3 4 registerregisterregisterregister i s 0 5 forforforfor i 1 i外部同步 RAM 外部异步 RAM FLASH ROM 对于程序代码 已经被烧录在 FLASH 或 ROM 中 我们可以让 CPU 直接 从其中读取代码执行 但通常这不是一个好办法 我们最好在系统启动后将 FLASH 或 ROM 中的目标代码拷贝入 RAM 中后再执行以提高取指令速度 对于 UART 等设备 其内部有一定容量的接收 BUFFER 我们应尽量在 BUFFER被占满后再向CPU提出中断 例如计算机终端在向目标机通过RS 232 传递数据时 不宜设置 UART 只接收到一个 BYTE 就向 CPU 提中断 从而无谓 浪费中断处理时间 如果对某设备能采取 DMA 方式读取 就采用 DMA 读取 DMA 读取方式在 读取目标中包含的存储信息较大时效率较高 其数据传输的基本单位是块 而所 传输的数据是从设备直接送入内存的 或者相反 DMA 方式较之中断驱动方 式 减少了 CPU 对外设的干预 进一步提高了 CPU 与外设的并行操作程度 活用位操作活用位操作 使用 C 语言的位操作可以减少除法和取模的运算 在计算机程序中数据的 位是可以操作的最小数据单位 理论上可以用 位运算 来完成所有的运算和操 作 因而 灵活的位操作可以有效地提高程序运行的效率 举例如下 1 方法 1 2 int i j 3 i 879 16 4 j 562 32 5 方法 2 6 int i j 7 i 879 4 8 j 562 562 5 5 对于以 2 的指数次方为 或 因子的数学运算 转化为移位运算 通常可以提高算法效率 因为乘除运算指令周期通常比移位运算大 C 语言位运算除了可以提高运算效率外 在嵌入式系统的编程中 它的另一 个最典型的应用 而且十分广泛地正在被使用着的是位间的与 3 outword INT MASK wTemp 而将该位设置为 1 的做法是 1 define define define define INT I2 MASKINT I2 MASKINT I2 MASKINT I2 MASK 0 x00400 x00400 x00400 x0040 2 wTemp inword INT MASK 3 outword INT MASK wTemp INT I2 MASK 判断该位是否为 1 的做法是 1 define define define define INT I2 MASKINT I2 MASKINT I2 MASKINT I2 MASK 0 x00400 x00400 x00400 x0040 2 wTemp inword INT MASK 3 ifififif wTemp INT I2 MASK 4 5 该位为 1 6 上述方法在嵌入式系统的编程中是非常常见的 我们需要牢固掌握 总结总结 在性能优化方面永远注意 80 20 准备 不要优化程序中开销不大的那 80 这是劳而无功的 宏定义是 C 语言中实现类似函数功能而又不具函数调用和返回开销的较好 方法 但宏在本质上不是函数 因而要防止宏展开后出现不可预料的结果 对宏 的定义和使用要慎而处之 很遗憾 标准 C 至今没有包括 C 中 inline 函数的 功能 inline 函数兼具无调用开销和安全的优点 使用寄存器变量 内嵌汇编和活用位操作也是提高程序效率的有效方法 除了编程上的技巧外 为提高系统的运行效率 我们通常也需要最大可能地 利用各种硬件设备自身的特点来减小其运转开销 例如减小中断次数 利用 DMA 传输方式等

展开阅读全文

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值