2014年2月18日 星期二

【Java】這樣設計物件有差喔!

差在哪裡?

我同樣用迴圈的方式放大其中的差異...在迴圈中執行「宣告動作」,──簡單來說,就是用類別 new 一個物件出來啦!

Test1執行的結果為100毫秒(大概的平均值)。

Test2執行的結果卻要12000毫秒。

Test3執行的結果更是增加到36000毫秒。

所以......愛護你/妳的程式、增加你/妳程式的效能,請從減少不必要的參數開始。

但萬一真的有必要,要使用「很多判斷式」.......把Test1/Test2/Test3改造成下列型式,然後參數規格都修改成一樣........


結果執行速度就差異不大...頂多1~2%,而且浮動性很高,極可能是「記憶體回收」或是其他干擾造成的。

重點在於:宣告階段影響程式效能的關鍵在「參數多寡」。



對!我聽到馬上有人質疑:反正一個物件宣告完後就擺在哪,何必計較宣告動作的效能呢?

今天假設是要做遊戲,比如某個關卡會有無限的「飛彈」、「小怪物」產生,「飛彈」不停被擊落、又不停射出,「小怪物」不停被打死、又不停被召喚........

當然可以把飛彈/怪物本身「被擊落與否」、「死亡與否」用純粹參數代替,(飛彈被擊落?重回原點等待發射,怪物死亡?重回原點等待召喚。)

如果採用這個做法,那確實沒有考量這點差異的必要。



但思考一下這個效能差異的由來......

雖然上面的附圖沒有截載,但關鍵在於記憶體。

記憶體配置?記憶體寫入?.......不管是哪一點,如果換個迴圈跑法,只是單純的做個ArrayList,然後一直塞物件進去、看記憶體何時爆掉........

Test3最快,Test2大約要Test3的三倍,Test1則是Test2的兩倍多一些......

還沒有機會測試使用了介面後的結果,但想必是相同的,因為使用介面根本不會有太多影響,介面(似乎)是類別的一部份,只會存在類別中,而不在物件存於記憶體的「標記/區段」上。

沒有留言:

張貼留言