jQuery add()替代性能

时间:2012-10-23 14:07:17

标签: javascript jquery

我知道如何将两个jQueries一起添加using add()

但是,对于我正在开展的项目,它已成为性能瓶颈。我摆弄了一下,想出了一个替代方案,它在性能提升方面给了我相同的结果(大约60毫秒对这小提琴的1000毫秒):

http://jsfiddle.net/jedierikb/rkAP4/1/

var t = $("#test");
var tKids = t.children( );
var j = $("#jest");
var jKids = j.children( );

var z,
    zMax = 30000;

var time1 = new Date();
for (z=0; z<zMax; z++)
{
    var opt1 = tKids.add( jKids );
}
var time2 = new Date();

for (z=0; z<zMax; z++)
{
    var i,
        iMax,
        allKids = [];
    for(i = 0, iMax = tKids.length; i < iMax; i++)
    {
        allKids.push( tKids[i] );
    }
    for(i = 0, iMax = jKids.length; i < iMax; i++)
    {
        allKids.push( jKids[i] );
    }
    var opt2 = $( allKids );
}
var time3 = new Date();

console.log( (time2-time1) + " v " + (time3-time2) );​

注意:我不需要添加的好处,例如保证dom-element排序和删除重复项。

我想知道是否有办法让这种方法比我正在进行的所有迭代更清洁或更紧凑。或者也许有更好的方法。

2 个答案:

答案 0 :(得分:2)

我知道你可能会因为性能原因而试图远离jQuery API方法,但这值得一试:

var t = $('#test').children();
var j = $('#jest').children();
var added = t.get().concat(j.get());

我不确定.get()有多快,但我很难想象它比迭代每组孩子要慢。可以进行jsperf测试......

修改

后人:http://api.jquery.com/get/

  

.get()方法授予我们访问每个jQuery对象下面的DOM节点的权限。

答案 1 :(得分:0)

如果允许混合“孩子”的顺序,你可以减少一些循环

for (z=0; z<zMax; z++)
    {
        var tLen = tKids.length;
        var jLen = jKids.length;
        var maxLen = Math.max(tLen, jLen);
        var allKids = [];
        for(var i = 0; i < maxLen; i++)
        {
            if (i<tLen) allKids.push(tKids[i]);
            if (i<jLen) allKids.push(jKids[i]);
        }
        var opt2 = $( allKids );
    }​