2007年3月30日 星期五

(書名)遊戲之旅-我的程式設計感悟 - 組合語言優化 part1

遊戲之旅-我的程式設計感悟
作者為大陸人雲風
此書的內容在於作者寫遊戲之來的心得及技術經驗
對於遊戲設計初心者來說是蠻不錯的一本書
有興趣的人可以去找來看看~

題外話:淡江的圖書館真的蠻好的~ 這本書也算是蠻新的一本 我是第一個借閱的.. XD

來談談此一章節前面的心得吧
6.2.2 低效率的靜態變數
對於靜態變數及區域變數 你認為哪一個的效率會比較好?
或許有人認為區域變數在用到時才被分配出來
而靜態變數是一開始就分配好的 理所當然靜態變數的效率較好
當然這個想法是錯誤的
區域變數是存在系統堆疊上的 在分配上僅僅是一行指令(修改esp暫存器)即可實現
(一組區域變數的宣告只做一次 而非一個變數一次)
將變數放在堆疊中 其最大的好處是 函數能夠重複使用記憶体
在目前的函式退出後,記憶体空間被回收,又再進入新的函式時
又會再次使用相同位址的記憶体
而當同一塊的記憶体被使用時,修過OS的人就知道
其資料會被存放到CPU的L1 cache中,所以存取的速度相當快
在大部分的情況之下,存取堆疊頂部的資料都符合此一條件
相較之下靜態變數就沒有此一優點。
在CPU與MEM做交換資料的同時,往往成為程式的速度瓶頸。

同樣的道理,臨時建構一個物件,如果使用系統提供的new operator
則會間接呼叫了malloc而導致較低效率的操作
較好的方法則是使用placement new,而改用alloca在堆疊中分配物件所需的空間
並且在退出函式時直接呼叫物件的解構子 而非使用delete
使函式在退出時的堆疊操作自動回收記憶體

總之 不論在設計角度或是在於效率角度 靜態變數的使用應該僅量避免

這一篇就到這邊結尾吧~~

2 則留言:

yen3 提到...
作者已經移除這則留言。
yen3 提到...

靠邀...兩個blog style 都一樣...結果我搞混了XD