用于大数据集的Javascript数组取消移位和弹出操作

用于大数据集的Javascript数组取消移位和弹出操作,javascript,arrays,Javascript,Arrays,我有一个用于存储数字的大数组(大小为1000或更多),这个数组值将用于实时渲染y轴线图 我将不断unshift此数组以添加新数据,并pop删除数组中的最后一个数据。此操作允许图形从左向右移动 但是,这种unshift和pop的方法很简单,但是当我的数组大小增加并且我可能有多个图(第n个图,每个图包含一个大数组)时,它会导致内存碎片和时间性能。我可以知道有没有更好的方法来执行此操作吗?我很好奇,对传统的相同内存复制进行了移位/推送测量,结果非常清楚,没有必要进行优化 var p=[],q=[];

我有一个用于存储数字的大数组(大小为1000或更多),这个数组值将用于实时渲染y轴线图

我将不断
unshift
此数组以添加新数据,并
pop
删除数组中的最后一个数据。此操作允许图形从左向右移动


但是,这种
unshift
pop
的方法很简单,但是当我的数组大小增加并且我可能有多个图(第n个图,每个图包含一个大数组)时,它会导致内存碎片和时间性能。我可以知道有没有更好的方法来执行此操作吗?

我很好奇,对传统的相同内存复制进行了移位/推送测量,结果非常清楚,没有必要进行优化

var p=[],q=[];
对于(var i=0;i<10000;i++)p[i]=i;
对于(var i=0;i<10000;i++)q[i]=i;
函数旋转_1(a,x){
var len=a.长度;
对于(变量i=1;i”);
t=新日期()
对于(var i=0;i<100000;i++)旋转_2(q,i);
document.write(“shift/push=”);
文件写入(新日期()-t);

文件。写(“
”)我很好奇地测量了传统的相同内存复制的移位/推送,结果非常清楚,没有必要进行优化

var p=[],q=[];
对于(var i=0;i<10000;i++)p[i]=i;
对于(var i=0;i<10000;i++)q[i]=i;
函数旋转_1(a,x){
var len=a.长度;
对于(变量i=1;i”);
t=新日期()
对于(var i=0;i<100000;i++)旋转_2(q,i);
document.write(“shift/push=”);
文件写入(新日期()-t);

文件。写(“
”)这个问题有两个方面:

有没有更好的方法来做这个手术? 这很大程度上取决于你如何绘制图表。你有没有用过图书馆?如果是这样的话,它可能需要一个特定的数据(如数组),因此您对此无能为力。另一方面,如果要自己实现绘图零件,则可以使用所需的任何数据结构(包括此处可能适用的列表)

内存碎片和阵列性能
首先,问自己一个问题:您在
数组
操作中是否确实存在性能问题,或者这只是理论上的问题?

绘制图形比任何数组操作都要耗时。我认为您不应该担心
Array
方法的性能,除非您确实对它们有任何问题。请注意,JS引擎中的数组不一定是作为数组实现的。它们可能是二进制搜索树,甚至是其他东西,这取决于您如何使用它们,因此很难预测哪些优化将适用于您的情况,哪些将使情况变得更糟

有没有办法提高性能? 对。但这取决于实际如何使用数组。我可以想象,如果你画一个实时图形,然后
取消移位
/
弹出
数据,例如,每1秒,你就确切地知道数组的
长度
,对吗?它应该保持不变。因此,您可以做的一件事是,在开始时,为该长度的数组分配内存。如果将来执行
unshift
+
pop
,您的内存不应该碎片化,因为引擎很容易对其进行优化。但话说回来,这只是猜测,因为JavaScript引擎比我聪明。本文将介绍更多提示和技巧


不要试图修理没有坏的东西。在开始重构之前进行测量,不要过度思考。这被称为过早优化,我敢肯定,当您实际运行应用程序时,阵列操作不会成为优化的任何优先事项。

这个问题有两个方面:

有没有更好的方法来做这个手术? 这很大程度上取决于你如何绘制图表。你有没有用过图书馆?如果是这样的话,它可能需要一个特定的数据(如数组),因此您对此无能为力。另一方面,如果要自己实现绘图零件,则可以使用所需的任何数据结构(包括此处可能适用的列表)

内存碎片和阵列性能
首先,问自己一个问题:您在
数组
操作中是否确实存在性能问题,或者这只是理论上的问题?

绘制图形比任何数组操作都要耗时。我认为您不应该担心
Array
方法的性能,除非您确实对它们有任何问题。请注意,JS引擎中的数组不一定是作为数组实现的。它们可能是二进制搜索树,甚至是其他东西,这取决于您如何使用它们,因此很难预测哪些优化将适用于您的情况,哪些将使情况变得更糟

有没有办法提高性能? 对。但这取决于实际如何使用数组。我可以想象,如果你画一个实时图形,然后
取消移位
/
弹出
数据,例如,每1秒,你就确切地知道数组的
长度
,对吗?它应该保持不变。因此,您可以做的一件事是,在开始时,为arra分配内存