在我的程序中,我分配了很多数组(数百万)并且它们都非常小。
因为重复分配大块内存比小块内存更快,我正在寻找一种方法来分配大块内存,保持指向该块中当前位置的指针以从中抽取下一个数组,然后在那个用尽的时候分配另一个大块。
这可以用C#做,如果有,怎么做?我有一种感觉Marshal.AllocHGlobal
可能正是我正在寻找的,但我不太确定C#是否有更多管理方式。
作为一个例子,我想分配一个1,000字节的内存块,然后创建一个长度为4的数组,使用前4个字节,然后创建一个长度为3的数组,使用接下来的3个字节字节。
答案 0 :(得分:4)
没有更多背景,很难回答。但听起来你正在寻找类似ArraySegment的东西,它是访问数组部分的抽象。
使用ArraySegment
,您只需创建一个大型数组,然后在逻辑上将其拆分为多个段。
如果您创建的数百万个数组是短暂的,那么创建并忘记它们就可以了。垃圾收集器善于处理短期引用。
记住,垃圾收集所花费的时间与您创建的对象数量不成正比,但与垃圾收集中存在的对象数量成正比。因此,如果您的对象是短暂的,那么最好创建许多数组。
如果它超过85,000字节,那么创建一个巨大的数组是一件坏事,因为它将位于LOH中,而不是在GC上压缩。 没有压缩 - >碎片的可能性很大。