栈,寄存器,局部变量,内存,语言级别优化程序的方法
棧,寄存器,局部變量,內(nèi)存,語言級(jí)別優(yōu)化程序的方法
棧是內(nèi)存中開辟出一塊空間,對(duì)應(yīng)到匯編中就是棧段 stack segment,即SS,它是由高地址向低地址生長的
寄存器是CPU中的一些高速存儲(chǔ)器,有16位(8086),32位(80386),64位(x64),相當(dāng)于CPU的內(nèi)存,因?yàn)镃PU速度很快,為了充分發(fā)揮它的能力,就為它配備了這些高速的寄存器用來數(shù)據(jù)讀寫。
局部變量可能在棧中,也可能在寄存器中。當(dāng)寄存器較多時(shí),局部變量就盡可能的放在寄存器中,以提高存取速度,如果寄存器數(shù)量不足,則局部變量被存儲(chǔ)在稱棧段的內(nèi)存中。
LUA虛擬機(jī)是使用棧來實(shí)現(xiàn)基礎(chǔ)功能的。LUA5之前的虛擬機(jī)是基于棧(模擬棧)實(shí)現(xiàn)的,LUA5之后是基于寄存器實(shí)現(xiàn)的。
LUA5之后采用了128個(gè)寄存器(這是網(wǎng)上抄來的,據(jù)說不是真正的寄存器,是模擬的?因?yàn)?2位CPU內(nèi)部最多也就20-30個(gè)寄存器),可以將大量的局部變量存儲(chǔ)在其中,因此LUA優(yōu)化速度的方法之一便是盡量將變量局部化
?
有了這些有的是,程序優(yōu)化的通用方法如下:參考:
- 掌握常用的高效的數(shù)據(jù)結(jié)構(gòu)和算法。 至少要熟悉模板的使用。
- 消除循環(huán)的低效率, 盡量減少循環(huán)次數(shù)。 盡量不要在循環(huán)里 循環(huán)計(jì)算一些不會(huì)改變的值。?
- 消除不必要的存儲(chǔ)器引用。 盡量使用臨時(shí)變量來暫存要多次使用的引用值,避免尋址開銷。?
- 防止寄存器溢出。 臨時(shí)變量也并不是越多越好, 因?yàn)榧拇嫫骺偸怯邢薜?#xff0c;如果需要同時(shí)使用的臨時(shí)變量數(shù)超過了可用的寄存器數(shù)量,編譯器會(huì)把臨時(shí)值存放到棧中。 一旦出現(xiàn)這種情況, 性能會(huì)急劇下降。(x86-64代碼能夠同時(shí)累積最多 12 個(gè)值, 而不會(huì)溢出任何寄存器。)
- 循環(huán)展開。 通俗的說就是利用分治的策略來減小循環(huán)的迭代次數(shù)。?
- 提高并行性。 大多數(shù)情況下,程序的代碼都不是按部就班的一步一步從上往下執(zhí)行的, 它會(huì)適當(dāng)?shù)牟⑿幸恍┎幌嘁蕾嚨拇a行。 所以盡量編寫不相依賴的代碼, 能夠提高運(yùn)行效率。
- 編寫利于分支預(yù)測(cè)的代碼。?在 CPU 執(zhí)行分支時(shí), 會(huì)預(yù)測(cè)程序朝哪一個(gè)分支方向執(zhí)行。 如果預(yù)測(cè)錯(cuò)誤會(huì)被罰時(shí)。
處理方法一般是?
(1): 編寫能被預(yù)測(cè)的分支。
(2):書寫條件傳送實(shí)現(xiàn)的代碼, 不依賴分支預(yù)測(cè)。? - 利用存儲(chǔ)器結(jié)構(gòu)體系?:由于存儲(chǔ)器山的存儲(chǔ)器結(jié)構(gòu),利用了?時(shí)間局部性?和?空間局部性?的代碼, 能極大的提高緩存命中, 從而使程序執(zhí)行的更快。
- 多線程編程: 適當(dāng)?shù)膽?yīng)用多線程, 特別是多CPU的情況下, 程序的性能666的飛起。
-
多線程 + 線程池: 多線程的進(jìn)階版本。?
-
參考資料:
《深入理解計(jì)算機(jī)系統(tǒng)》
- 掌握常用的高效的數(shù)據(jù)結(jié)構(gòu)和算法。 至少要熟悉模板的使用。
posted on 2018-07-29 10:23 時(shí)空觀察者9號(hào) 閱讀(...) 評(píng)論(...) 編輯 收藏
與50位技術(shù)專家面對(duì)面20年技術(shù)見證,附贈(zèng)技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的栈,寄存器,局部变量,内存,语言级别优化程序的方法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 在coursera上有哪些值得推荐的课程
- 下一篇: 【转】volatile关键字。编译器不优