2
4

3 回答 3

4

为了回答您的“疑问”,我建议使用JSPerf对您的代码进行基准测试。除非经过测试,否则仅凭代码无法真正判断该过程是否比另一个更快。

另外,我建议您在构造过程中使用数组和对象的文字符号而不是new符号:

var objArray=[
    {
        property : 'some string property'
    }, {
        ...
    },
];

此外,根据您的代码,最好有这个,因为每次迭代都使用相同的对象:

var obj = objArray[0].property1,
    objIDX = 0;

for(var x=0; x<65536; x++){
    doSomething(obj,objIDX);
}
于 2012-08-26T00:55:10.920 回答
3

我意识到这并不能完全回答您的问题(因为它已经得到了回答),但是因为您似乎正在寻找关于发生数千次的函数调用的速度改进(因为其他人可能也在这样做)。我想我会把它包括在这里,因为它违背了假设:

一个示例函数:

var go = function (a,b,c,d,e,f,g,h) {
  return a+b+c+d+e+f+g+h;
}

以下是您通常如何调用重复函数:

var i=500000; while(i--){
  go(1,2,3,4,5,6,7,8);
}

但是,如果这些参数中没有一个(或少数几个)因函数的这种特定用途而改变,那么这样做会更好(从速度 pov - 显然不是异步 pov)

var i=500000; go.args = [1,2,3,4,5,6,7,8];
while(i--){
  go();
}

为了使上述工作正常,您只需对原始功能稍作修改:

var go = function (a,b,c,d,e,f,g,h, i) {
  if ( go.args ) {
    i = go.args;
    a = i[0]; b = i[1];
    c = i[2]; d = i[3];
    e = i[4]; f = i[5];
    g = i[6]; h = i[7];
  }
  return a+b+c+d+e+f+g+h;
}

第二个函数的运行速度明显更快,因为您没有传入任何参数(一个没有参数调用的函数非常快速启动)。从 .args 数组中提取值似乎也不那么昂贵(除非您涉及字符串)。即使您更新一两个参数,它仍然快得多,这使其非常适合像素或图像数据操作,因为您通常只移动 x 和 y:

var i=500000; go.args = [1,2,3,4,5,6,7,8];
while(i--){
  go.args[2] = i;
  go();
}

所以在某种程度上,这是一个对象属性可以比本地变量更快的例子——如果有点复杂和离题;)

于 2012-08-26T02:02:19.047 回答
2

尽管有可能的浏览器优化,但访问对象的属性比访问局部变量(但不一定是全局变量或父函数的变量)更昂贵。

属性越深,您受到的性能影响就越大。换句话说,

for(var x=0; x<65536; x++) 
 doSomething(objArray[0].property1, objIDX=0); 

将通过缓存得到改进objArray[0].property1,而不是重复分配给objIDX

var prop = objArray[0].property1;
objIDX = 0;
for(var x=0; x<65536; x++) 
 doSomething(prop, 0); 
于 2012-08-26T00:50:40.353 回答