2014-10-29 51 views
0

我有一個任務,它包括在創建泛型類型ArrayListList的實例時解釋以下結果。int32類型的ArrayList如何可以比Int32類型的列表大嗎

ArrayList de Int32 = 280 ns ; 1.603.604 bytes 
List<Int32> = 59 ns ; 408.224 bytes 
ArrayList de String = 77 ns ; 408.224 bytes 
List<String> = 74 ns ; 408.224 bytes 

我花的時間相當大的量試圖弄清楚這一點,和時間的另一大量試圖找到在互聯網上的東西,並沒有什麼。

在此先感謝:)

+3

我想拳擊使這個變化。發佈代碼,以便我們可以看到你的測試做了什麼。 – 2014-10-29 11:20:22

+0

'ArrayList'不是泛型類型。因此,像Int32這樣的valueetype項目,裝箱將對運行時間產生很大影響。 – nvoigt 2014-10-29 11:21:20

+0

我沒有代碼,唯一給出的是輸出... – GhostOfHeresy 2014-10-29 11:55:14

回答

2

我不認爲這是可以問問題的解決方案。另一方面,我認爲這個任務是愚蠢的,因爲你要麼閱讀某個地方的差異,以及.NET中的泛型如何工作或不工作,所以我想我會回答。

ArrayList不是通用的,這意味着它包含一個對象數組。每個int都應該裝入一個對象中,這個對象會像12個字節(我認爲一個對象的開銷是12個字節,但我可能會關閉幾個字節)添加到實際的4個字節的數據中。這是在對象中包裝int的內存成本。執行包裝和解包也有CPU時間成本。另一方面,列表或任何值類型都是專用的。這意味着CLR會爲整數生成一個特殊版本的列表。內部數組是一個int數組而不是對象,因此不會爲數據損失額外的內存。由於沒有進行裝箱和拆箱,時間也得到了改善。請注意,其他物體對GC施加了壓力,必須在某個時刻收集它們。

對於字符串沒有懲罰,因爲字符串是引用類型,所以它們的工作方式基本與對象相同。它們已經包含12個字節的開銷。在鑄造時檢查類型可能會有一些小的CPU開銷,但不執行昂貴的裝箱。這就是爲什麼通用列表和ArrayList之間在性能和內存方面沒有顯着差異的原因。另外值得注意的是,這種方法並不是泛型在所有語言中的工作方式。例如Java非常不同,因此如果您使用某些非.NET技術,請務必檢查您的知識是否適用。

+0

感謝您的回答,這項任務真的讓人困惑...... – GhostOfHeresy 2014-10-29 11:54:28

+1

在64位系統中,對象包裝應該佔用16個字節(類型指針爲8,指向「System.Object」,對於同步塊指針爲8 )。添加整數的32位。將數組的指針添加到裝箱的int中。這是28個字節。所以,一個'List '將需要每個整數4個字節,而一個'ArrayList'將需要28個字節。 – dcastro 2014-10-29 12:00:39

+0

@dcastro好像測試是在32位,因爲ArrayList版本只需要4倍的空間。 – Stilgar 2014-10-29 12:05:36

相關問題