Javascript 删除不带接头的阵列元素()
我正在开发一个JavaScript游戏,我希望尽可能降低内存使用率。 因此,我再次将一些对象设置为null,这样它们就可以被垃圾回收。 我读了一篇文章,其中建议避免使用像Javascript 删除不带接头的阵列元素(),javascript,performance,memory,array-splice,Javascript,Performance,Memory,Array Splice,我正在开发一个JavaScript游戏,我希望尽可能降低内存使用率。 因此,我再次将一些对象设置为null,这样它们就可以被垃圾回收。 我读了一篇文章,其中建议避免使用像Array.splice()这样的函数,因为这样会创建一个新的数组,分配新的内存 因此,我使用自己的函数实现了一个,该函数删除特定索引处的元素并将所有元素移到后面,因此长度将设置为length-=1。这只会影响现有阵列,而不会创建新阵列: 要使用而不是拼接的函数: deleteElem = function(arr, el)
Array.splice()
这样的函数,因为这样会创建一个新的数组,分配新的内存
因此,我使用自己的函数实现了一个,该函数删除特定索引处的元素并将所有元素移到后面,因此长度将设置为length-=1
。这只会影响现有阵列,而不会创建新阵列:
要使用而不是拼接的函数:
deleteElem = function(arr, el) {
var index = arr.indexOf(el);
if (index > -1) {
var len = arr.length - 1;
for (var i = index; i < len; i++) {
arr[i] = arr[i + 1];
}
arr.length = len;
}
}
deleteElem=函数(arr,el){
var指数=arr.indexOf(el);
如果(索引>-1){
var len=阵列长度-1;
对于(var i=指数;i
我的函数的JSFIDLE有时更快,有时更慢。。。
我应该更关注更好的表现和更差的记忆,还是更好的记忆和更差的表现
还有哪些其他方法可以避免使用
Array.splice
?您需要了解jsperf是如何运行代码的。它不会在每次运行代码时都运行安装程序-每次运行安装程序时,代码都会运行数百次或数千次
这意味着您对99.9999999%的调用使用了空数组,因此没有测量任何有用的内容
通过这样测量,您至少可以从中获得一些意义,但是您需要注意的是,50倍数组的分配可能会减弱差异,因此您的方法实际上比基准测试显示的要快得多。如果您想经常添加/删除项,你是否考虑过使用字典而不是数组?我不知道关于拼接…在你知道你有问题之前不要优化。当然,平坦的内存使用是一个很好的理想,但是javascript的设计与之相悖,以至于几乎可以肯定会出现渐进的锯齿。如果触发的GC导致了一个实际的、可感知的问题,做出这样的调整(到那时,你将有一个完整的程序进行基准测试,这样你就可以用真实数据做出这样的决策),你应该看看右边“相关”列中的前两个结果。好的,在我让一切变得更糟之前,我可能会保留array.splice()。正如我还发现的那样,我的数组没有排序,因此我可以将最后一个元素移动到删除项的当前位置,而不是移动所有元素。