2012-02-02 30 views
1

我有一个全局数组,包含我目前使用的元素的ID。每一秒我都会运行一个例程来处理这些元素。jQuery对象数组的性能

var ids = ['abc', 'def', 'zyx'] 

// the following code happens every second 
for (var i = 0; i < ids.length; i++) { 
    el = $("#" + ids[i]) 
    // do stuff with el 
} 

我的问题:我将遭受显着的性能损失或改善执行以下操作:

var ids = [] 
ids.push($("#abc")) 
ids.push($("#def")) 
ids.push($("#zyx")) 

for (var i = 0; i < ids.length; i++) { 
    el = ids[i] 
    // do stuff with el 
} 

回答

0

你不必猜 - 为什么不是create a jsPerf test case

无论如何,这种改变会大大提高性能。没有理由一直重构相同元素的jQuery对象。我的意见:keep things DRY — cache everything that can be reused

还要注意的是,而不是:

var ids = []; 
ids.push($("#abc")); 
ids.push($("#def")); 
ids.push($("#zyx")); 

你可能只是做:

var ids = [ $("#abc"), $("#def"), $("#zyx") ]; 

这样可以节省几个函数调用。

+0

谢谢,我不知道的是在数组中存储jquery对象的开销。 – 2012-02-02 08:54:47

+0

-1我必须低估这一点,因为它绝对不会提高性能*极大*。有一个改进,这是值得的,但它仍然只是几乎没有明显的。 – Guffa 2012-02-02 09:17:23

+1

好吧,我可以理解也许不是很大,但它似乎是一个首选的方法。另外我不知道jsPerf,所以我发现它是一个有用的答案。 – 2012-02-03 00:11:57

2

,你不会看到任何显着业绩增长,但它仅仅是一个好习惯 - 到不要两次请求这件事,只要你能在一个地方停留一次。

所以我最后的忠告:缓存jQuery的对象只是一次使用jQuery的数组,下班后对象

1

,你会得到轻微改善,因为你是移动的一些工作圈外的,做它只有一次。

虽然只有三个项目,很少像每秒一次一样,但您几乎不会注意到其中的差异。通过id定位一个元素是相当容易的,因为浏览器专门为此提供了一种方法,创建一个jQuery对象也不是那么容易。

+0

当然,它可能多达20个左右。当我们无法控制客户端的硬件时,每一点点都会有所帮助! – 2012-02-02 08:55:21

+0

@JeffV:即使多达20人,也不会有太多的工作。最近一台体面的电脑上的浏览器可以每秒处理大约1000次。我做了一个性能测试,这表明差别不是很大。 http://jsperf.com/precreate-jquery-objects – Guffa 2012-02-02 13:11:59