2011-08-18 20 views
0

例如,在draw方法中,我需要使用Rectangle的一個實例。像這樣:小對象:經常創建還是重用?

Rectangle rect = new Rectangle(FrameSize * CurrentFrame, 0, FrameSize, FrameSize); 

或其他方式。定義臨時的矩形數據成員,然後像這樣使用它:

rect.X = FrameSize * CurrentFrame; 
rect.Y = 0; 
rect.Width = FrameSize; 
rect.Height = FrameSize; 

哪種方式更好?有一件事讓我感到困惑的是,許多矩形經常創建,但許多代碼解決方案使用第一種方法,而第二種應該小心內存消耗。

+1

Rectangle實例化的成本很小,除非您在每次繪製調用時都做很多事情,我不會擔心。 –

回答

2

除非您已經通過仔細衡量證明重用可以提高性能,否則應該每次都創建一個新對象。

.NET處理對象創建和GC效率非常高,您不應該擔心這裏的任何性能問題。第二種解決方案需要更仔細的編碼,以確保您不會重複使用其他地方使用的對象,並且您之前的狀態沒有變化。進一步你會有更多的對象老化到GC中的gen1或gen2。

+0

我通常在方法中創建臨時實例,並僅在此方法內重用它們。 – lazychaser

+0

度量度量度量。 –

3

我個人會在大多數情況下使用第一種方法 - 理想情況下,如果類型是有意義的,並且類型是在您的控制之下,則使類型不可變。

垃圾收集器非常善於回收短暫對象 - 並且創建新對象意味着您不需要擔心是否有某種仍舊引用舊對象(從而使其更改成爲問題)。

2

對象有多久?如果他們只是在本地創建,然後被繪圖方法使用,那麼他們很可能會被收集到第零代,這非常有效。

重新使用臨時矩形的問題是,如果您試圖讓它掛在方法的生命週期之外,那麼對於通常的修改將會產生問題。作爲一般規則,如果在分析後發現#1成爲問題,我會考慮#2,並且只考慮#2。

1

當涉及到可能的錯誤時,前者更安全,對於Rectangle類是可變的,可以產生一些奇怪和難以察覺的效果。

我不認爲性能損失嚴重到足以冒險冒險在可變結構的野外世界。

0

考慮到結構分配上棧,繪製方法,我個人會選擇第一種方法的情況下,事實上,作爲

  1. 對象創建和初始化

  2. 使用

  3. 在我們離開該功能時推到GC。

所以這是一個快速創建並快速從內存中移除的小對象。

0

我會在實例的基礎上做到這一點。重用它並不會獲得太多收益,並且使代碼更易於破解。通過在實例的基礎上進行,您可以在方法中封裝一些邏輯,並且不必擔心由於方法之外的因素而導致中斷。