第34部分-Linux x86 64位汇编 优化

第34部分-Linux x86 64位汇编 优化

内存优化

编写高性能的汇编语言程序时,最好尽可能地避免内存访问。最快的方式是通过寄存器,但是不可能所有应用程序数据都保存在寄存器中。

对于有数据缓存的处理器来说,内存中按照连续的顺序访问内存能够帮助提高缓存命中率,内存块会一次被读取到缓存中。

         目前X86的缓冲块就是cacheline长度是64位,如果数据元素超过64位块必须是要次缓存操作才能获取或者存储内存中的数据元素。

         Gas汇编器支持.align命令,用于在特定的内存边界对准定义的数据元素。在数据段中,.align命令紧贴在数据定义的前面,指示汇编器按照内存边界安置数据元素。

优化分支指令

分支指令严重影响应用程序性能,大多数现代处理器利用指令预取缓存提高性能。在程序运行时,指令预取缓存被填充上顺序的指令。

乱序引擎试图尽可能快地执行指令。分支指令对乱序引擎有严重的破坏作用。

         编译器创建汇编语言代码时候,猜测if语句的then部分比else部分更可能被执行,试图优化代码的性能。

消除分支,例如在使用cmova前先试用cmp指令。有时候重复几个额外的指令能够消除跳转。

         编写可预测分支的代码,把最可能采用的代码安排在向前跳转的顺序执行语句中。

         展开循环,一般循环都可以通过向后分支规则预测,但是正确预测分支仍然有性能损失。简单的循环也需要每次迭代时检查计数器,还有必须计算的跳转指令,根据循环内程序逻辑指令的数量,可能开销也很大。对于比较小的循环,展开循环能够解决这个问题,展开循环意味着手动地多次编写每条指令的代码,而不是使用循环返回相同的指令。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值