草庐IT

Javascript For 循环 VS JQuery 每个 : strange result

coder 2025-01-18 原文

我已经阅读了关于这个主题的几个问题/文章,并且我在我的解决方案中测试了使用 for 的相同代码块在大多数情况下比 each 快.

然而,我的问题与事实有关,在我的页面中,我有大约 30 个“循环”,使用 each 的起始结果约为 5300ms(平均),最大值为 5900ms,最小值为4800 毫秒。

在我将它们更改为 for 之后,最终结果出人意料地变慢了,比之前的平均值花费了更多的时间(而且从未低于 4800 毫秒,甚至高于 6000 毫秒)。 ...但是当我将 console.time('Time') console.timeEnd('Time') 放在每个“循环 block ”中时,我得到了预期的结果( FOR 更快)。

使用 for 的全局“时间”怎么可能比使用 each 慢?

能否指出一些可能的原因?

P.S.- 完整的源代码非常庞大,这里重要的部分是唯一的变化是:循环 each 转换为 for .

用于 For 循环的示例

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

}

用于每个循环的示例

$.each(list, function (i, item) {

});

更新 #1

  • 使用 console.time('Time') 测量时间 console.timeEnd('时间')。对于全局时间,我只使用一个“计数器”。对于多个计数器,我当然使用不同的名称。
  • 在所有这些“过程”中,没有 Ajax 请求,因此时间差与此无关。

更新 #2

  • 正如@epascarello 所要求的:每个循环的“内部代码”从未改变,这不应该是原因,当我们以相同的方式访问这个对象时更是如此(使用 ForEach ) list[i].SomeProperty,恕我直言,时间差异永远不能归咎于内部代码(我认为)。

更新#3

  • 有时我使用不同的变量 iiiiii 使用级联“循环”。
  • 我经常在同一个函数中“重用”变量:

var l = list1.length; ...; l = list2.length;

这同样适用于for 变量iiiiii

更新 #4

我注意到 Chrome 中的一个奇怪行为:以下模式用于重复多次,下降一段时间然后再次上升。

  • DrawGUI:6159.000 毫秒再次启动
  • DrawGUI:5990.000 毫秒下降
  • DrawGUI:5804.000 毫秒下降
  • DrawGUI:5416.000 毫秒下降
  • DrawGUI:5315.000 毫秒下降
  • DrawGUI:5311.000 毫秒下降
  • DrawGUI:5325.000 毫秒
  • DrawGUI:5248.000 毫秒下降
  • DrawGUI:5010.000 毫秒下降
  • DrawGUI:4886.000 毫秒下降
  • DrawGUI:5645.000 毫秒*UP AGAIN *
  • DrawGUI:5247.000 毫秒
  • DrawGUI:5446.000 毫秒

在所有这些测试期间,我关闭了所有其他 chrome 选项卡和不必要的应用程序。尽量减少不稳定的 CPU 可用性。

最佳答案

由于您正在对空循环进行基准测试,因此您为 JIT(即时编译器)提供了充足的优化空间。 each 调用可能会被一起删除,因为它没有副作用。但是,for 循环必须运行,因为 i 定义在 包含 for 循环的范围内,而不是在 for 循环内。

(function() {
    for (var i=0; i<10; i++) {}
    console.log(i); // outputs 10
})();

对比

(function() {
    [0,1,2,3,4,5,6,7,8,9].forEach(function(i) {});
    console.log(i); // i is not declared
})();

这也是 JSLint/JSHint 提示 i 被以下代码声明两次的原因:

for (var i=0; i<10; i++) {}
for (var i=0; i<10; i++) {}

关于Javascript For 循环 VS JQuery 每个 : strange result,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14583941/

有关Javascript For 循环 VS JQuery 每个 : strange result的更多相关文章

  1. ruby - 树顶语法无限循环 - 2

    我脑子里浮现出一些关于一种新编程语言的想法,所以我想我会尝试实现它。一位friend建议我尝试使用Treetop(Rubygem)来创建一个解析器。Treetop的文档很少,我以前从未做过这种事情。我的解析器表现得好像有一个无限循环,但没有堆栈跟踪;事实证明很难追踪到。有人可以指出入门级解析/AST指南的方向吗?我真的需要一些列出规则、常见用法等的东西来使用像Treetop这样的工具。我的语法分析器在GitHub上,以防有人希望帮助我改进它。class{initialize=lambda(name){receiver.name=name}greet=lambda{IO.puts("He

  2. ruby-on-rails - 在 Ruby 中循环遍历多个数组 - 2

    我有多个ActiveRecord子类Item的实例数组,我需要根据最早的事件循环打印。在这种情况下,我需要打印付款和维护日期,如下所示:ItemAmaintenancerequiredin5daysItemBpaymentrequiredin6daysItemApaymentrequiredin7daysItemBmaintenancerequiredin8days我目前有两个查询,用于查找maintenance和payment项目(非排他性查询),并输出如下内容:paymentrequiredin...maintenancerequiredin...有什么方法可以改善上述(丑陋的)代

  3. ruby - RuntimeError(自动加载常量 Apps 多线程时检测到循环依赖 - 2

    我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("

  4. ruby - Ruby 中的闭包和 for 循环 - 2

    我是Ruby的新手,有些闭包逻辑让我感到困惑。考虑这段代码:array=[]foriin(1..5)array[5,5,5,5,5]这对我来说很有意义,因为i被绑定(bind)在循环之外,所以每次循环都会捕获相同的变量。使用每个block可以解决这个问题对我来说也很有意义:array=[](1..5).each{|i|array[1,2,3,4,5]...因为现在每次通过时都单独声明i。但现在我迷路了:为什么我不能通过引入一个中间变量来修复它?array=[]foriin1..5j=iarray[5,5,5,5,5]因为j每次循环都是新的,我认为每次循环都会捕获不同的变量。例如,这绝对

  5. ruby - 将n维数组的每个元素乘以Ruby中的数字 - 2

    在Ruby中,是否有一种简单的方法可以将n维数组中的每个元素乘以一个数字?这样:[1,2,3,4,5].multiplied_by2==[2,4,6,8,10]和[[1,2,3],[1,2,3]].multiplied_by2==[[2,4,6],[2,4,6]]?(很明显,我编写了multiplied_by函数以区别于*,它似乎连接了数组的多个副本,不幸的是这不是我需要的)。谢谢! 最佳答案 它的长格式等价物是:[1,2,3,4,5].collect{|n|n*2}其实并没有那么复杂。你总是可以使你的multiply_by方法:c

  6. ruby - 每个页面上的 Jekyll 分页 - 2

    据我们所知,Jekyll默认分页仅支持index.html,我想创建blog.html并在那里包含分页。有什么解决办法吗? 最佳答案 如果您创建一个名为/blog的目录并在其中放置一个index.html文件,那么您可以向_config.yml表示paginate_path:"blog/page:num"。不是使用根文件夹中的默认index.html作为分页器模板,而是使用/blog/index.html。分页器将根据需要生成类似/blog/page2/和/blog/page3/的页面。这将使您到达yourwebsite.com/b

  7. ruby - `gem install` 多个 gem 的语法是什么,为每个 gem 指定版本? - 2

    如何使用geminstall同时安装多个gem,同时指定我想要的版本?例子:geminstallakami-v1.2.0--ignore-dependenciesgeminstallatomic-v1.1.14--ignore-dependenciesgeminstallaws-s3-v0.6.2--ignore-dependenciesgeminstallbackports-v3.3.0--ignore-dependenciesgeminstallbrendanlim-sms-fu-v1.0.0--ignore-dependenciesgeminstallbuilder-v3.1.3

  8. ruby-on-rails - 未定义的方法每个 rails 错误 - 2

    我正在通过位于http://ruby.railstutorial.org的教程在Rails上试用ruby.我已经到了可以创建用户并将他们的姓名和头像显示在以下位置的地步:http://localhost:3000/users/1现在我想在用户访问时显示所有用户:http://localhost:3000/users/这是我的Controller:classUsersController这是我的看法。#Viewforindexactioninuser'scontroleerAllusers我收到以下错误。undefinedmethod`each'fornil:NilClass谁能告诉我为

  9. Ruby:数组中的下一个/上一个值,循环数组,数组位置 - 2

    假设我有一个没有特定顺序的随机数数组。假设这些是参加马拉松比赛的人的ID#,他们按照完成的顺序添加到数组中,例如:race1=[8,102,67,58,91,16,27]race2=[51,31,7,15,99,58,22]这是一个简化且有些做作的示例,但我认为它传达了基本思想。现在有几个问题:首先,我如何获得特定条目之前和之后的ID?假设我正在查看运行者58,我想知道谁在他之前和之后完成了比赛。race1,runner58:previousfinisher=67,nextfinisher=91race2,runner58:previousfinisher=99,nextfinishe

  10. ruby - 奇怪的 ruby​​ for 循环行为(为什么这样做有效) - 2

    defreverse(ary)result=[]forresult[0,0]inaryendresultendassert_equal["baz","bar","foo"],reverse(["foo","bar","baz"])这行得通,我想了解原因。有什么解释吗? 最佳答案 如果我使用each而不是for/in重写它,它看起来像这样:defreverse(ary)result=[]#forresult[0,0]inaryary.eachdo|item|result[0,0]=itemendresultendforainb基本上就

随机推荐