我有一种情况,我分配了大量内存,但在许多较小的子阵列中。我注意到,一旦我通过每个数组大约 85,000 字节的阈值,性能就会明显变差。我假设性能下降是因为较小的数组被分配在“小对象堆”(SOH)而不是“大对象堆”(LOH)上。
# 数组 | 每个数组的大小(字节) | 分配时间 |
---|---|---|
1,154 | 532,480 | 377毫秒 |
1,319 | 465,920 | 412毫秒 |
1,539 | 339,360 | 439 毫秒 |
1,847 | 332,800 | 435毫秒 |
2,308 | 266,240 | 446毫秒 |
3,077 | 199,680 | 491毫秒 |
4,616 | 133,120 | 514毫秒 |
9,231 | 66,560 | 4420毫秒 |
请注意,在所有情况下,分配的总内存约为586MB,但在最后一种情况下,分配的时间要长一个数量级。
快速解决此性能问题的第一个想法是以某种方式告诉 C# 运行时我想要大型对象堆中的这些数组,即使它们小于阈值。我认为这将使分配时间与其他情况一致。
但是,我似乎无法找到是否有办法做到这一点。看起来以前没有人想要一个对象进入大对象堆。所以,我问:是否有可能以某种方式标记这些数组以强制它们进入大对象堆,即使它们小于 85,000 字节的阈值?
(将 85,000 字节阈值降低到 65,000 字节的方法也可以解决我的问题,但我也找不到解决方法!)