如何将Int32类型的ArrayList大于Int32类型的List

时间:2014-10-29 11:17:00

标签: c# .net generics

我有一项任务,其中包括在创建泛型类型ArrayListList的实例时解释以下结果。

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

我花了相当多的时间试图解决这个问题,并且花了很多时间试图在网上找到一些东西,什么都没有。

提前致谢:)

1 个答案:

答案 0 :(得分:2)

我认为要求解决任务是不行的。另一方面,我认为这个任务是愚蠢的,因为你要么在某处阅读有关差异的内容以及.NET中的泛型是如何工作的,所以我想我无论如何都会回答。

ArrayList不是通用的,这意味着它包含一个对象数组。每个int都应该装在一个对象中,这个对象增加了12个字节(我认为对象的开销是12个字节,但我可能会偏离几个字节)到实际的4个字节数据。这是在对象中包装int的内存开销。进行包装和展开也需要CPU时间成本。另一方面,List或任何值类型都是专用的。这意味着CLR为int生成列表的特殊版本。内部数组是int而不是对象的数组,因此数据不会丢失额外的内存。由于没有执行装箱和拆箱,因此时间也有所改善。请注意,其他对象会对GC施加压力,必须在某些时候收集它们。

对于字符串,没有惩罚,因为字符串是引用类型,因此它们基本上与对象的工作方式相同。它们已包含12个字节的开销。在投射时检查类型可能会有一些小的CPU开销但不执行昂贵的装箱。这就是通用列表和ArrayList

之间在性能和内存上没有显着差异的原因

另外值得注意的是,这种方法不是泛型如何在所有语言中工作。例如,Java是完全不同的,因此如果您使用某种非.NET技术,请务必检查您的知识是否适用。