所以基本上我正在尝试找到一种内存有效的方法来复制数组。假设我们arr1
包含500000个值为true
的元素:
var arr1 = [];
for (var i = 0; i < 500000; i++) {
arr1[i] = true;
}
在Node.js中,占用大约32.3 MiB(包括节点启动时的18.7 MiB)。现在,显然当你引用arr1
时,不会分配任何内存:
var arr2 = arr1;
现在,当我将arr1
复制到arr2
:
var arr2 = arr1.concat();
该过程占用36.2 MiB,因此约为4 MiB。
这就是事情:无论我做什么来清空或擦除原始数组,分配给该数组的内存都不会被垃圾收集器释放或拾取。假设我有:
arr1.length = 0;
delete arr1;
arr1 = undefined;
arr1 = arr2.concat();
多亏了这一点,这个过程现在占据了39.8 MiB。
那么这里到底发生了什么?是否有一些秘密引用原始数组Node(或那里的任何JS引擎)试图向我隐藏?这是进一步的代码:
arr2.length = 0;
delete arr2;
arr2 = undefined;
arr2 = arr1.concat();
只会“清空”arr2
,因此它可以保留arr1
的副本。你可能已经想到了,我正在尝试来回传输阵列的内容,但现在这个过程占用了43.5 MiB。如果这是一个大阵列,内存摄入将是巨大的。有没有办法做到这一点,考虑到记忆效率?
答案 0 :(得分:1)
您的分析技术不正确。
我以与您相同的方式创建了一个数组,并使用与您相同的ICollection<Controller>
方法创建了“克隆”,这里是结果
因为你可以看到它是由2个引用保留的相同数组(仅需约2.06Mb)。
相应的jsfiddle:http://jsfiddle.net/6o0h0r1j/
相关阅读:
总结一下:你的假设从一开始就是错误的。