2010-07-21 41 views
1

我有一个“for”函数在jQuery可拖动函数中执行。从执行时间的角度来看,有没有更好的方法来做到这一点?我的作用是:jQuery/Javascript“for”功能性能改进

$("#dragger").draggable({ 

      containment: '#timeline', 
      axis: 'x', 
      drag: function(event, ui) { 

      var divs = $("#timeline div.timeline"); 
      for (var i=0, il=divs.length; i<il; i++) { 
       var layer = '#layer'+i, 
       gow = layer+"Go"; 
       SelectClosestKeyframes(this, event, ui, $(layer), $(gow)); 
      } 
     }  
    }); 

我能提高for (var i=0, il=divs.length; i<il; i++) 感谢名单

回答

5

考虑到你在循环中做什么,试图优化循环机制是毫无意义的。首先,无论如何,我怀疑你可以把它变得更好,其次,因为那些循环代码的代价是由所有这些jQuery调用的代价所压缩的。

你首先找到一堆<div>元素。然后您遍历该列表,但是您的代码根本不使用“divs”数组。相反,它每次迭代都会执行2次以上的jQuery查找(尽管它们基于元素ID,但价格相当便宜),以及该函数中的任何工作。

您是如何得出循环需要“优化”的结论的?页面是否缓慢?如果是这样,那么我会看看那个“SetClosestKeyframes”函数,看看有什么。除非有几百万个“div.timeline”元素,否则你的问题不是循环本身。

+0

+1,非常好的答案,即将发布。他可以优化循环,http://blogs.sun.com/greimer/resource/loop-test.html但正如你所说,循环不是问题。 – Anders 2010-07-21 12:10:22

+0

嗯,我认为它更好地声明:var layer ='#layer'+ i,gow = layer +“Go”;然后var layer ='#layer'+ i; var gow = layer +“Go” – Mircea 2010-07-21 12:36:19

+0

@Mircea哦!我没有注意到这个逗号!你说得对,没关系。我会编辑我的答案。 – Pointy 2010-07-21 12:52:17

2

http://www.websiteoptimization.com/speed/10/是我以前用于优化Java脚本回路一个很好的资源。

+0

所有这些技术都会在这里完全浪费精力。 – Pointy 2010-07-21 12:09:19

+1

您是否在无目的的世界中提出一个关于行动徒劳的哲学观点?那么足够公平。但问题是“我能改善......”,而不是“我会看到改善......的好处”。给提问者一些功劳,知道他为什么提出这个问题。 – Yellowfog 2010-07-21 12:24:52

+0

那么,为什么他问这个问题并不重要。循环已经很不错了,因为他在开始时保存了长度。与所有函数调用相比,循环机制不会导致任何感知问题。 (另外,该站点相当老旧,所以我很怀疑它的任何基准都与现代Javascript运行时系统有关。) – Pointy 2010-07-21 12:54:16

0

我希望重构SelectClosestKeyframes函数,以便它绑定到具有时间线类的div。和/或使用“每个”。

0

不,这将是更快了,只是清洁:

var dragable = this; 
$("#timeline div.timeline").each(function(i) { 
    SelectClosestKeyframes(dragable, event, ui, $('#layer'+i), $('#layer'+i+'Go')); 
}); 

实际上each()会比你for()但在一个非常微小的尺度慢一点。