对象预分配与直接使用的Javascript性能数组

对象预分配与直接使用的Javascript性能数组,javascript,Javascript,我怀疑如何影响对象数据数组的使用速度,也就是说,直接使用它或将它们预先分配给简单的变量 我有一个元素数组,例如1000个元素 每个数组项都是一个具有10个属性的对象(例如) 最后我用这些性质做了10次计算 所以我有办法 var nn = myarray.lenght; var a1,a2,a3,a4 ... a10; var cal1,cal2,.. cal10 for (var x=0;x<nn;x++) { // assignment a1=my_array[x].data1;

我怀疑如何影响对象数据数组的使用速度,也就是说,直接使用它或将它们预先分配给简单的变量

  • 我有一个元素数组,例如1000个元素

  • 每个数组项都是一个具有10个属性的对象(例如)

  • 最后我用这些性质做了10次计算

所以我有办法

var nn = myarray.lenght;
var a1,a2,a3,a4 ... a10;
var cal1,cal2,.. cal10
for (var x=0;x<nn;x++)
{ // assignment
  a1=my_array[x].data1;
   ..
  a10 =my_array[x].data10; 

  // calculations
  cal1 = a1*a10 +a2*Math.abs(a3);
  ... 
  cal10 = (a8-a7)*4 +Math.sqrt(a9);
}
var nn=myarray.lenght;
变量a1、a2、a3、a4。。。a10;
变量cal1,cal2,。。cal10

对于(var x=0;x来说,简短的回答是:这取决于您的javascript引擎,这里没有对与错,只有“这在过去是有效的”和“这似乎不再加快速度”

如果我不运行jsperf测试,我将使用“缓存示例”1示例:

一般的经验法则是(read:was),如果要在数组中多次使用元素,则可以更快地将其缓存在局部变量中,如果要在对象上多次使用属性,则也应将其缓存

例如: 您有以下代码:

// Data generation (not discussed here)
function GetLotsOfItems() {
    var ret = [];
    for (var i = 0; i < 1000; i++) {
        ret[i] = { calc1: i * 4, calc2: i * 10, calc3: i / 5 };
    }
    return ret;
}

// Your calculation loop
var myArray = GetLotsOfItems();
for (var i = 0; i < myArray.length; i++) {
    var someResult = myArray[i].calc1 + myArray[i].calc2 + myArray[i].calc3;
}
这里要做的是从最后一个元素开始,然后使用条件块查看i>0,然后将其降低1(允许循环以i==0运行(而--i将从1000->1运行)但是,在现代代码中,这通常比较慢,因为您将向后读取数组,并且以正确的顺序读取数组通常允许运行时或编译时优化(请注意,这是自动的,因此您不需要为这项工作做任何事),但根据您的javascript引擎,这可能不适用,并且向后循环可能会更快

然而,根据我的经验,这将在chrome中运行得比第二个“有点优化”的版本慢(我没有在jsperf中测试过这一点,但在我2年前编写的CSP解算器中,我停止了缓存数组元素,但没有缓存属性,我从0到长度运行了循环


您应该(在大多数情况下)以一种易于阅读和维护的方式编写代码,在我看来,缓存数组元素与非缓存元素一样易于阅读(如果不容易的话),并且它们可能更快(至少不会更慢),如果您使用带有javascript自动完成功能的IDE,它们的编写速度会更快:P

您可以在中比较脚本的性能。您可以添加填充元素数组的示例吗?Jsperf…您是否遇到任何性能问题?如果没有,您认为您需要优化此部分的原因是什么?回答以下问题:数组访问
[x] 
在所有JS引擎中都进行了高度优化,不需要任何临时变量。@civiltomain:可能是,可能不是。同样,在你遇到问题之前,没有必要寻求解决方案。如果你只是好奇,请jsperf它并让我们知道(自我回答问题是合适的)。
// Data generation (not discussed here)
function GetLotsOfItems() {
    var ret = [];
    for (var i = 0; i < 1000; i++) {
        ret[i] = { calc1: i * 4, calc2: i * 10, calc3: i / 5 };
    }
    return ret;
}

// Your calculation loop
var myArray = GetLotsOfItems();
for (var i = 0; i < myArray.length; i++) {
    var someResult = myArray[i].calc1 + myArray[i].calc2 + myArray[i].calc3;
}
// Your cached calculation loop
var myArray = GetLotsOfItems();
var element;
var arrayLen = myArray.length;
for (var i = 0; i < arrayLen ; i++) {
    element = myArray[i];
    var someResult = element.calc1 + element.calc2 + element.calc3;
}
var myArray = GetLotsOfItems();
var element;
for (var i = myArray.length; i--;) { // Start at last element, travel backwards to the start
    element = myArray[i];
    var someResult = element.calc1 + element.calc2 + element.calc3;
}