Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 删除不带接头的阵列元素()_Javascript_Performance_Memory_Array Splice - Fatal编程技术网

Javascript 删除不带接头的阵列元素()

Javascript 删除不带接头的阵列元素(),javascript,performance,memory,array-splice,Javascript,Performance,Memory,Array Splice,我正在开发一个JavaScript游戏,我希望尽可能降低内存使用率。 因此,我再次将一些对象设置为null,这样它们就可以被垃圾回收。 我读了一篇文章,其中建议避免使用像Array.splice()这样的函数,因为这样会创建一个新的数组,分配新的内存 因此,我使用自己的函数实现了一个,该函数删除特定索引处的元素并将所有元素移到后面,因此长度将设置为length-=1。这只会影响现有阵列,而不会创建新阵列: 要使用而不是拼接的函数: deleteElem = function(arr, el)

我正在开发一个JavaScript游戏,我希望尽可能降低内存使用率。 因此,我再次将一些对象设置为null,这样它们就可以被垃圾回收。 我读了一篇文章,其中建议避免使用像
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()。正如我还发现的那样,我的数组没有排序,因此我可以将最后一个元素移动到删除项的当前位置,而不是移动所有元素。