栈,寄存器,局部变量,内存,语言级别优化程序的方法
栈是内存中开辟出一块空间,对应到汇编中就是栈段 stack segment,即SS,它是由高地址向低地址生长的
寄存器是CPU中的一些高速存储器,有16位(8086),32位(80386),64位(x64),相当于CPU的内存,因为CPU速度很快,为了充分发挥它的能力,就为它配备了这些高速的寄存器用来数据读写。
局部变量可能在栈中,也可能在寄存器中。当寄存器较多时,局部变量就尽可能的放在寄存器中,以提高存取速度,如果寄存器数量不足,则局部变量被存储在称栈段的内存中。
LUA虚拟机是使用栈来实现基础功能的。LUA5之前的虚拟机是基于栈(模拟栈)实现的,LUA5之后是基于寄存器实现的。
LUA5之后采用了128个寄存器(这是网上抄来的,据说不是真正的寄存器,是模拟的?因为32位CPU内部最多也就20-30个寄存器),可以将大量的局部变量存储在其中,因此LUA优化速度的方法之一便是尽量将变量局部化
有了这些有的是,程序优化的通用方法如下:参考:
- 掌握常用的高效的数据结构和算法。 至少要熟悉模板的使用。
- 消除循环的低效率, 尽量减少循环次数。 尽量不要在循环里 循环计算一些不会改变的值。
- 消除不必要的存储器引用。 尽量使用临时变量来暂存要多次使用的引用值,避免寻址开销。
- 防止寄存器溢出。 临时变量也并不是越多越好, 因为寄存器总是有限的,如果需要同时使用的临时变量数超过了可用的寄存器数量,编译器会把临时值存放到栈中。 一旦出现这种情况, 性能会急剧下降。(x86-64代码能够同时累积最多 12 个值, 而不会溢出任何寄存器。)
- 循环展开。 通俗的说就是利用分治的策略来减小循环的迭代次数。
- 提高并行性。 大多数情况下,程序的代码都不是按部就班的一步一步从上往下执行的, 它会适当的并行一些不相依赖的代码行。 所以尽量编写不相依赖的代码, 能够提高运行效率。
- 编写利于分支预测的代码。 在 CPU 执行分支时, 会预测程序朝哪一个分支方向执行。 如果预测错误会被罚时。
处理方法一般是
(1): 编写能被预测的分支。
(2):书写条件传送实现的代码, 不依赖分支预测。 - 利用存储器结构体系 :由于存储器山的存储器结构,利用了 时间局部性 和 空间局部性 的代码, 能极大的提高缓存命中, 从而使程序执行的更快。
- 多线程编程: 适当的应用多线程, 特别是多CPU的情况下, 程序的性能666的飞起。
-
多线程 + 线程池: 多线程的进阶版本。
-
参考资料:
《深入理解计算机系统》