栈,寄存器,局部变量,内存,语言级别优化程序的方法
生活随笔
收集整理的這篇文章主要介紹了
栈,寄存器,局部变量,内存,语言级别优化程序的方法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
棧,寄存器,局部變量,內存,語言級別優化程序的方法
棧是內存中開辟出一塊空間,對應到匯編中就是棧段 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的飛起。
-
多線程 + 線程池: 多線程的進階版本。?
-
參考資料:
《深入理解計算機系統》
- 掌握常用的高效的數據結構和算法。 至少要熟悉模板的使用。
posted on 2018-07-29 10:23 時空觀察者9號 閱讀(...) 評論(...) 編輯 收藏
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的栈,寄存器,局部变量,内存,语言级别优化程序的方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 在coursera上有哪些值得推荐的课程
- 下一篇: 【转】volatile关键字。编译器不优