我注意到 Array.Copy 在多维数组上使用时会导致大量堆分配。具体来说,请考虑以下几点:
static void Test()
{
int size = 100;
byte[,] source = new byte[size, size];
byte[,] target = new byte[size, size];
Copy(source, target);
}
static void Copy(byte[,] source, byte[,] target)
{
System.Array.Copy(source, target, source.Length);
}
Run Code Online (Sandbox Code Playgroud)
复制方法会产生 332 KB 的垃圾。
深入挖掘,这一切都来自 GetValueImpl 方法。我检查了单声道源代码(我为此使用单声道编译器),似乎 Array.Copy 首先尝试执行 FastCopy (尚未找到其实现),如果失败,它最终会执行
Object srcval = sourceArray.GetValueImpl (source_pos + i);
Run Code Online (Sandbox Code Playgroud)
对于数组中的每个元素。字节数 (332K) 与装箱两个数组中每个元素所产生的数量完全对应。
如果我用长度为 10000 的 1d 数组替换 2d 数组,则不会发生这种情况:我的 Copy 方法不会产生任何分配。我错过了什么还是这是一个错误?
| 归档时间: |
|
| 查看次数: |
244 次 |
| 最近记录: |