5
非连续数组性能好吗?
在C#中,当用户创建一个List<byte>并向其中添加字节时,它有可能用完空间并需要分配更多空间。它分配前一个数组的大小的两倍(或其他倍数),复制字节并丢弃对旧数组的引用。我知道该列表成倍增长,因为每次分配都很昂贵,这将其限制在O(log n)分配范围内,10每次仅添加额外的项就会导致O(n)分配。 但是,对于大型阵列,可能会浪费大量空间,可能几乎是阵列的一半。为了减少内存,我写了一个类似的类NonContiguousArrayList,List<byte>如果列表中的内存少于4MB,它将用作后备存储,然后它会NonContiguousArrayList随着大小的增加分配额外的4MB字节数组。 与List<byte>这些阵列不同,它们是非连续的,因此周围没有数据复制,只有额外的4M分配。查找项目时,将索引除以4M以获得包含该项目的数组的索引,然后对4M取模以获取数组内的索引。 您能指出这种方法的问题吗?这是我的清单: 不连续的数组没有缓存局部性,这会导致性能下降。但是,在4M的块大小下,似乎将有足够的位置进行良好的缓存。 访问一个项目不是那么简单,存在一个间接的附加级别。这会优化吗?会导致缓存问题吗? 由于达到4M限制后线性增长,因此您可以分配比平时更多的分配(例如,对于1GB内存,最多可以分配250个分配)。4M之后不会复制任何额外的内存,但是我不确定额外的分配是否比复制大块内存更昂贵。
12
c#