【问题标题】:Which is fastest: $.each, .ForEach, for-loop or something else? [closed]哪个最快:$.each、.ForEach、for-loop 还是其他? [关闭]
【发布时间】:2013-06-22 17:42:36
【问题描述】:

我无法决定我应该使用 $.each(array, function(){...}) 还是 array.ForEach(...) 或其他。所以我打电话给给我this link, which is fantastic if it's reliable的may google。

据此,不同方法之间的速度存在巨大差异。此外,一般来说,for 循环似乎是首选。

我不是 JavaScript 专家,所以我想从一些精通 JS 的成员那里获得一些意见。

【问题讨论】:

标签: javascript performance for-loop foreach


【解决方案1】:

可能是原生 for 循环(好吧,除了歌剧之外的所有地方,foreach 更快,但这是另一回事)。

但是在 99.9% 的情况下确实无关紧要

如果可以的话,总是更喜欢可读的代码而不是更快的代码。所有这些类型的循环都可以在一台普通机器上每秒处理数十万次迭代。

可读代码在这里更重要——如果一个$.each 超过 100 个元素对你来说似乎更可读——无论如何都要这样做(我个人通常更喜欢Array.forEach,主要是因为它是原生的并且与原生 .map 一致.filter.reduce 等等)。如果您在循环中执行大量工作,则差异会变得更小。

假设您有一个名为 doSomethingWithCurrent 的方法:

for(var i=0;i<elements.length;i++){
   var current = elements[i];
   doSomethingWithCurrent(current);
}

对比:

elements.forEach(doSomethingWithCurrent);

第二个可能更慢,但它也更具可读性(至少对我而言),这使得它更易于维护。

下面的场景怎么样 - 你有一个包含名字和姓氏的对象数组,你想创建一个包含全名的新字符串数组:

普通循环:

var new = [];
for(var i=0;i<names.length;i++){
    new.push(names[i].firstName+" "+names[i].lastName);
}

使用地图:

var new = names.map(function(elem){ 
    return elem.firstName+" "+elem.lastName;
});

再次,我发现第二个更易读,即使它更慢。编写可维护和可读的代码通常比编写快速代码更重要。

也就是说,“什么更易读”通常是个人喜好问题,保持一致很重要。

对于沙漠 - 吃点 Knuth:

程序员会浪费大量时间来思考或担心程序中非关键部分的速度,而在考虑调试和维护时,这些提高效率的尝试实际上会产生强烈的负面影响。我们应该忘记小的效率,比如大约 97% 的时间:过早优化是万恶之源。然而,我们不应该放弃那关键的 3% 的机会。

【讨论】:

  • 我同意你对可读性问题的看法。我通常遵循团队假定的约定或先前部署的代码所暗示的约定。让我印象深刻的是这些方法之间的巨大差异。我也意识到,即使是我 Foxy 上最慢的方法也比 IE 上最好的方法快得多。尽管如此,我还是有点窒息。感谢您的回复。
  • @KonradViltersten 你链接到的那个性能是众所周知的:) (特别是在更多的扩展版本中,包括while 替代,倒计时等)。这类性能问题在 nodejs 的上下文中更为常见( 当然是找到瓶颈之后)。在客户端 JavaScript - for 循环的性能并不重要(有时在游戏中)。只需尝试在其中坚持一个密集的动作,实际循环的开销就会很快消失。团队的约定绝对是要走的路:)我不是说不要优化,而是在必要时优化。
  • 明智的话,本杰明。谢谢!
【解决方案2】:

在将 Jquery 循环与 javascript 循环进行比较时,您需要记住 Jquery 是使用 javascript 实现的。

所有的 Jquery 函数最终都会运行标准的 javascript 代码。

因此,这意味着在大多数情况下,原生 javascript 会更高效。

我最喜欢的速度循环是:

for(var i, ilen = MAXLENGTH; i < ilen; i++){
}

除非在这种情况下遍历 javascript 对象:

for(var key in object){
     if(object.hasOwnProperty(key)){

     }
}

这代表了将 Jquery 与 javascript 进行比较时的大多数用例。

$('#elementid'); 

慢很多
$(document.getElementById('elementId'));

还有许多其他示例。

Jquery 可用于使代码看起来更干净或在版本 2 之前实现跨浏览器兼容性。

但是在高性能情况下,如果你能保证只需要支持现代浏览器,javascript 通常会快得多。

【讨论】:

  • 比较 $(selector)$.each 并不真正相关,因为 $.each 是一个美化的 for 循环,而选择器开始解析然后搜索。
  • @pickypg:我相信 SlitCanvas 正在促进 jQuery 几乎总是比原生 javascript 慢(在任何情况下),只是因为它执行校验和并增加了任何操作的开销。
  • 是的,布拉德是正确的。虽然我喜欢 Jquery 的易用性和跨浏览器支持。我发现用老式的方式做事会更快、更有效。
  • 我同意一般情况,但我不同意$.each 的情况。肯定会有开销,因为它会检查以验证传入的对象“isArrayLike”,但它会从那里执行一个原始的for 循环。对于原始速度,毫无疑问,但在一般情况下,当它不是真正的瓶颈时,我会质疑 JQuery 很慢因此不值得的假设,除非需要兼容性。在 JQuery 实现中达到顶峰,他们在内部将按照建议的方式执行上述最佳循环(有点开销),我建议这样做是为自己买单。
  • 虽然我同意标准的 HTML 页面,但两者之间不会有明显的区别。查看上面问题中包含的 Jsperf 链接显示了 Jquery 与 javascript 的可怕现实。至于 for 循环的浏览器兼容性。在基本循环的情况下,我希望 Jquery 不需要兼容性。
【解决方案3】:

谈到 JavaScript,我经常在原始速度和知道函数存在之间纠结。

根据 Mozilla,在 IE9 之前,IE 不支持 Array.forEach

因此,我会尽量避免使用普通的 for 循环,因为 JSPerf 显示在 Chrome 中运行得更快(至少),或者来自 JQuery 的旧 $.each,因为您可以依赖以下事实它就在那里,而且很可能会在某个时候开始在内部使用Array.forEach

【讨论】:

  • 对已经实现的语言特性进行填充是完全合法的。在处理必须支持旧版浏览器的代码时,我经常填充 forEachmapfilter 之类的东西。
  • 我完全同意这一点。我还填充 Array.indexOfString.trim 支持 $.trim,主要是因为可读性。
猜你喜欢
  • 1970-01-01
  • 2011-10-22
  • 2018-10-31
  • 2017-12-07
  • 2013-08-07
  • 1970-01-01
  • 2015-04-20
  • 2010-12-22
  • 2019-09-03
相关资源
最近更新 更多