问题
使用delete
数组元素将其从数组中删除是我意识到从数组中删除元素以使.forEach()
调用跳过索引的唯一方法.
问题
例如,使用delete
on索引exampleArray[i]
会导致后续exampleArray.push()
增加数组对象的内存消耗吗?
删除对象如何影响垃圾收集器?
是否有更有效的方法来消除exampleArray
元素?
前者的例子
var exampleArray = []; var n = 500; //Does this line imply a memory allocation? exampleArray.length = n; exampleArray.fill("Lorem Ipsum", 0); exampleArray.forEach(function(cur, ind, arr) { if(ind % 4 === 0) { delete arr[ind]; //Actually deletes the object itself, index no longer exists //Length does not change, however. Does available memory? } }, this); n /= 4; //Where, in memory, are these placed? while(n--) exampleArray.push("amet dolor");
感谢任何帮助,谢谢.
exampleArray[i]
例如,在索引上使用delete 会导致后续exampleArray.push()
增加数组对象的内存消耗吗?
push
增加内存消耗,无论它是否以a开头delete
.通常.如果引擎已为其他项目预先分配了存储空间,则可能不会.如果你想象引擎可能以某种方式重新使用由它打开的空间delete
,以避免在下一个分配额外的内存push
,很可能不会.
如何删除元素影响垃圾收集器?
如果删除的元素不在其他范围内,则该元素受GC影响.
是否有更有效的方法来消除
exampleArray
元素?
您必须决定是否介意使用稀疏数组.如果你不这样做,并且正如你指出的那样forEach
跳过这些洞,那么它delete
是最快的.如果要围绕已删除元素压缩数组,splice
例如,使用成本可能会高出2倍.
引擎实现了在内部表示数组的不同策略,有时在它们之间切换 - 例如,当数组达到特定程度的稀疏性时.每个引擎都有不同的策略.回答这些性能问题的唯一可靠方法是运行性能测试或读取引擎源.
他们关于GC的关键点是你不必担心它.你不想进入猜测引擎.您可以优化一个引擎,并发现另一个引擎的性能变差.
所有这些微优化问题仅在您拥有涉及大量数据对象的逻辑时才有意义,您需要在其上执行数百万个运算符.如果是这种情况,可能是您想要滚动自己的数据结构.