第34部分-Linux x86 64位汇编 优化
内存优化
编写高性能的汇编语言程序时,最好尽可能地避免内存访问。最快的方式是通过寄存器,但是不可能所有应用程序数据都保存在寄存器中。
对于有数据缓存的处理器来说,内存中按照连续的顺序访问内存能够帮助提高缓存命中率,内存块会一次被读取到缓存中。
目前X86的缓冲块就是cacheline长度是64位,如果数据元素超过64位块必须是要次缓存操作才能获取或者存储内存中的数据元素。
Gas汇编器支持.align命令,用于在特定的内存边界对准定义的数据元素。在数据段中,.align命令紧贴在数据定义的前面,指示汇编器按照内存边界安置数据元素。
优化分支指令
分支指令严重影响应用程序性能,大多数现代处理器利用指令预取缓存提高性能。在程序运行时,指令预取缓存被填充上顺序的指令。
乱序引擎试图尽可能快地执行指令。分支指令对乱序引擎有严重的破坏作用。
编译器创建汇编语言代码时候,猜测if语句的then部分比else部分更可能被执行,试图优化代码的性能。
消除分支,例如在使用cmova前先试用cmp指令。有时候重复几个额外的指令能够消除跳转。
编写可预测分支的代码,把最可能采用的代码安排在向前跳转的顺序执行语句中。
展开循环,一般循环都可以通过向后分支规则预测,但是正确预测分支仍然有性能损失。简单的循环也需要每次迭代时检查计数器,还有必须计算的跳转指令,根据循环内程序逻辑指令的数量,可能开销也很大。对于比较小的循环,展开循环能够解决这个问题,展开循环意味着手动地多次编写每条指令的代码,而不是使用循环返回相同的指令。