我有一个元素数组,如下所示:
myArray = [{name:'john',age:25},
{name:'marta',age:20},
{name:'pedro',age:22}]
我的程序一秒钟要访问一个对象好几次它的名字。我定义了这个函数:
function getPersonByName(name){
for (var i=0; i<myArray.length; ++i)
if (myArray[i].name == name)
return myArray[i]
}
var john = getPersonByName('john');
但每次运行的循环似乎并不有效。相反,我可以创建一个关联对象的哈希表,并保持更新:
var hash = {john:myArray[0], marta:myArray[1], pedro:myArray[2]}
var john = hash["john"]
但我不知道javascript的散列访问是如何定义的,那么,第二种方法真的更快吗?
实现这一点的最简单方法是缓存函数的结果,正如John Resig在学习高级javascript 时所解释的那样
你的功能看起来像这个
function getPersonByName(name){
if (getPersonByName.cache[name]) {
return getPersonByName.cache[name];
} else {
for (var i=0; i<myArray.length; ++i)
if (myArray[i].name == name) {
getElements.cache[name] = myArray[i];
return getPersonByName.cache[name];
}
}
}
getPersonByName.cache = {};
var john = getPersonByName('john');
John Resig几年前的统计数据显示,使用这种方法而不是使用直接DOM访问,性能提高了约7倍,这是一种在JQuery库中集成了很多的技术。
jsPerf 上提供了不同循环数组方式的性能测试
根据这些基准测试,您可以使用获得更好的性能
function getPersonByName(name){
for (var i<myArray.length; i--;)
if (myArray[i].name == name)
return myArray[i]
}
将myArray[i]存储在变量中可能会带来额外的好处,从而避免必须多次查找它。只是要小心在循环之外声明那个变量。
function getPersonByName(name){
var obj;
for (var i<myArray.length; i--;)
obj = myArray[i];
if (obj.name == name)
return obj;
}
jsPerf上的另一个基准测试表明,数组比对象更快。
没有一个基准可以完全复制您的使用。您可以在jsPerf上创建一个自定义测试。如果你不想在那里注册,你可以在jsdoit上使用quickbenchmark演示,或者下载许多性能/基准测试javascript库中的一个。在github上搜索基准来定位它们。