【问题标题】:JQuery map vs Javascript map vs For-loopJQuery map vs Javascript map vs For-loop
【发布时间】:2011-07-01 17:15:58
【问题描述】:

我正在实现一些非常适合地图的代码。但是,我要遍历的列表中有大量对象,所以我的问题是最好的方法是:

var stuff = $.map(listOfMyObjects, someFunction())

var stuff = listOfMyObjects.map(someFunction())

或者只是

var stuff = new Array(); 
for(var i = 0; i < listOfmyObjects.length; i++){
    stuff.push(someFunction(listOfMyObjects[i]));
}

【问题讨论】:

  • 您的示例不等效(也不使第一个代码 sn-p 有意义)。您的意思是对列表中的每个元素执行someFunction 吗?它是否返回一个值,并且您想用返回值替换列表条目?这其实就是map的想法。

标签: javascript jquery


【解决方案1】:

这是一个在 jsben.ch 中完成的测试用例:http://jsben.ch/#/BQhED

它表明 for-loop 映射比 jquery 映射更快(至少在 chrome 中)。

【讨论】:

  • 我也添加了问题中描述的第 3 种情况,但是您对 for 循环方法的推荐仍然对我来说排名第一(chrome)。
  • 看看 d3.js 和 underscore.js 映射方法与这些方法的比较会很有趣。
【解决方案2】:

后者(for循环)要快得多。我记得在某处看到过基准测试,但我似乎找不到链接。

如果性能确实是个问题,那么我会使用 for 循环。它并没有真正模糊代码。

【讨论】:

  • 除非他将 someFunction 内联到循环中,否则 for 循环可能会接近相同的性能。 map 本质上只是通过一个额外的函数调用来做同样的事情,但性能损失来自于每次调用该函数,这会填充每个函数的范围。
【解决方案3】:

首先,真正的Objects 没有本机.map() 方法,也没有.length 属性。所以我们要么谈论Arrays要么Array-like-objects(例如jQuery对象)。

但是,没有比使用原生 for、while 或 do-while 循环更快的迭代方法了。所有其他函数操作都会为每次迭代执行一个函数(猜猜是什么)。

jQuerys 的 .each() 将在传递对象时执行 for-in 循环。这是循环对象的最快方法。您可以自己使用for-in 并节省开销电话。

就可读性而言,另一种“好”的方式是利用 ES5 功能,例如 .keys() 和 .map()。例如:

var myObj = {
    foo:  'bar',
    base:  'ball',
    answer: 42,
    illuminati: 23
};

Object.keys( myObj ).map(function( prop ) {
    console.log( myObj[ prop ] );
});

我认为在可读性、便利性和性能方面这是一个很好的权衡。当然,您应该为老式浏览器使用 ES5 抽象库。

但同样,在性能方面无法击败原生循环。

【讨论】:

  • 对不起,我说错了。我的意思是说列表中的对象。编辑了我的问题以使其更有意义。
【解决方案4】:

+1 表示 Emil 的“测试它”答案 :) 这总是正确的答案。

但是,是的,本机循环获胜,您可以通过缓存长度来做得更好,这样 .length 引用就不会在每次迭代时进行评估。

for(var i = 0, l = list.length; i < l; i++)

或通过向后执行来避免额外的变量

for(var i = list.length-1; i >= 0; i--)

而且,如果您可以“内联”“someFunction”,那将会更快。基本上,尽可能避免函数调用和引用。但这只有在您真正关注细节的情况下。像这样的优化不太可能很重要。始终进行测试以找到您的瓶颈。

【讨论】:

  • for (var i=array.length; i--;) 是反向循环的更好选择。
【解决方案5】:

使用您的 html/javascript 代码在 jsperf 创建一个测试用例。

您将能够看到最有效的方法,以及不同浏览器执行循环的速度。

我会把钱花在原生 JavaScript 循环上,但你永远不会知道。

【讨论】:

    猜你喜欢
    • 2021-05-01
    • 1970-01-01
    • 2011-03-04
    • 2022-08-03
    • 1970-01-01
    • 2023-03-23
    • 2013-11-26
    • 2015-10-19
    • 1970-01-01
    相关资源
    最近更新 更多