2010-01-18 74 views
2

我重複構造一個具有20個字段的對象。該對象由單線程構造和使用。對象池或通過引用無狀態對象

我打算使用一個池或構造一個對象,並將其作爲參數傳遞給相關方法。完成後,將所有字段設置爲NULL。重複使用同一個對象。

我的問題是,這種方法會提高性能。因爲我可以推遲創建100,000個對象(有時甚至更多)。但是我需要爲每個字段設置空值,這個超額頭將與對象創建相比是否相等。

回答

4

如果沒有昂貴的初始化需要在對象創建上完成,我不會打擾。依靠運行時間來高效地進行內存管理。如果您最終發現應用程序中的瓶頸是對象的實際分配,可以嘗試進一步優化(儘管我懷疑將所有字段重置爲默認值會更快,但很可能不會)。

的一般規則是:不要過早(微)優化:-)

1

不要那樣做。你的微型優化可能會慢一些。

創建對象可能是Java 1.0的性能瓶頸,但現在已經不是了。現在彙集對象的唯一原因是具有與其關聯的重要資源的事物,如數據庫連接和線程。

+0

另外,只有在需要時纔會使用類,可能會防止任何細微的錯誤。 – gpampara 2010-01-18 09:03:30

0

我會建議不要使用內存池,除了構建數據庫連接或線程非常昂貴的外部資源外。 GC處理短期對象非常高效,因此創建和移除(遺忘)對象非常高效。

創建新元素和維護舊元素都存在相關成本。在這兩種情況下,字段的設置(值賦值)都是相似的,所以您必須比較其他相關成本。

對於新分配的對象,第二個成本就是內存分配。具有當前垃圾收集器的Java託管內存環境在分配內存方面非常高效。與操作系統需要找到合適的內存塊分配的C/C++相比,分代GC確保內存連續,並且分配速度非常快。在一些Java 1.4實現中,不足10個CPU指令是不夠的。年輕物體(不能通過第一次GC運行的物體)的分配速度也很快:它們簡單地被忽略 - 無論它們有終結物,應該儘可能地避免。

另一方面,在GC運行中存在的年輕對象必須在每次GC運行時從內存的一部分移動到另一部分。在物體被認爲已經足夠老化以進入老一代之前,這可能會發生好幾次,在那裏它可能會移動得更少(它仍然可以在壓縮GC中運行在老一代)。

長壽命對象的另一個問題是它們不能引用年輕一代對象。發生這種情況時(指定new X()舊對象)必須重新分配長壽命對象到最新一代,這也意味着成本,因爲它可能需要將對象從舊一代區域移動到新一代,這將在舊一代內存中留下一個洞,可能會迫使下一代舊版GC運行的對象移動到緊湊內存。

總而言之,重要的是有很多非常聰明的人在語言,編譯器和垃圾收集器中工作。所有這些人都將致力於提高最常見的成語的表現,並試圖智取系統可能會讓你走出一條輕鬆平穩的道路。

0

我一定會嘗試一下。雖然現在是「常識」,人們不應該關心對象創建,但事實上,使用對象池和特定類可能會獲得很多性能。對於文件處理框架,我通過彙集對象[]對象獲得了5%的讀取性能。