Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/383.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.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 性能/备选方案-从阵列开始删除x元素_Javascript_Arrays_Node.js_Performance - Fatal编程技术网

Javascript 性能/备选方案-从阵列开始删除x元素

Javascript 性能/备选方案-从阵列开始删除x元素,javascript,arrays,node.js,performance,Javascript,Arrays,Node.js,Performance,我有一个具有多个数组的对象,例如: var data = { ids: [], names: [], ages: [], relations: [], } 我将这些数组修剪到所需的最小数据量(250个元素),同时随着新数据可用,不断添加新数据。这意味着其他功能要处理的阵列要小得多(250个元素vs 70k),并且改进了逻辑,可能需要20秒才能完成,在±2秒内完成 我制作了一个简单的函数来循环遍历对象中的数组,并使用array.slice将每个数组修剪到作为参数提供的所需长度:

我有一个具有多个数组的对象,例如:

var data = {
  ids: [],
  names: [],
  ages: [],
  relations: [],
}
我将这些数组修剪到所需的最小数据量(250个元素),同时随着新数据可用,不断添加新数据。这意味着其他功能要处理的阵列要小得多(250个元素vs 70k),并且改进了逻辑,可能需要20秒才能完成,在±2秒内完成

我制作了一个简单的函数来循环遍历对象中的数组,并使用
array.slice
将每个数组修剪到作为参数提供的所需长度:

  trimPropertiesInObject(object, targetLength){
    for (var prop in object){
      var array = object[prop];

      object[prop] = array.slice(array.length-targetLength, array.length);
    }
    return object;
  }
  trimPropertiesInObject(data, 250);
这工作得非常好,速度相对较快,并将对象中的数组修剪到正好250个元素,尽管我注意到它仍然是整个执行过程中的一个瓶颈,以CPU核心允许的速度发生(在本例中为每秒500多次)

由于这仍然是0x flamegraph中的一个瓶颈,我很好奇是否还有进一步的优化空间,因为从技术上讲,这将允许每秒进行更多的迭代

我看到了大量的基准测试线程,尽管大多数似乎是用于克隆阵列或在最后删除元素。我需要显式地从数组的开头删除x元素,将数组修剪为y的精确长度


对进一步优化这样一个简单的函数有何想法?在这种情况下,是否有比
array.slice
更快的替代方案?或者我应该以不同的方式执行for循环吗?

您是否考虑过使用循环缓冲区,它可以有一个用于管理数据的底层链表或数组?这是这个用例常用的数据结构(),谢谢@megawac,这个概念对我来说是新的,我一定会仔细阅读!为什么要重新发明轮子!如果所有元素都将保留在内存中(在最大的主阵列上),@megawac的建议实际上是一个答案(它应该作为官方答案编写)。通常,如果只是从前面修剪元素,可以通过将数组包装到一个新的自定义类来创建数组视图,该类看起来和感觉都像数组对象(但对任何内容都不做物理更改,它只处理对所关心的索引范围的软引用),您可以考虑使用<代码>。
.slice
方法将创建数组的浅层副本,而
.splice
将在适当的位置修改它(这将更快)。因此,将
切片
行更改为
array.splice(0,array.length-targetLength)
可能会提高性能。感谢@CRice,这是一个很容易立即测试的测试!这在几次测试中都有轻微的改进,这太棒了!也将尝试循环缓冲区建议。