3 回答
为了回答您的“疑问”,我建议使用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);
}
我意识到这并不能完全回答您的问题(因为它已经得到了回答),但是因为您似乎正在寻找关于发生数千次的函数调用的速度改进(因为其他人可能也在这样做)。我想我会把它包括在这里,因为它违背了假设:
一个示例函数:
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();
}
所以在某种程度上,这是一个对象属性可以比本地变量更快的例子——如果有点复杂和离题;)
尽管有可能的浏览器优化,但访问对象的属性比访问局部变量(但不一定是全局变量或父函数的变量)更昂贵。
属性越深,您受到的性能影响就越大。换句话说,
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);