为什么jQuery inArray太慢了?

时间:2012-01-13 23:30:06

标签: javascript jquery performance loops

我运行some tests,数据指出jQuery inArray()比简单循环慢得多。

并且array.indexOf()甚至没有参加测试,因为我以前做过其他测试,而且表现更差。

  • 为什么它要慢得多?
  • 他们为什么不使用简单的循环?
  • 我有什么要监督的吗?

必须有充分的理由不使用它:

for(var i=0,len=arr.length,rtn=-1;i<len;i++){
    if(arr[i]==="arritem"){
        rtn=i;
        break;
    }
}

2 个答案:

答案 0 :(得分:5)

如果你要测试jQuery的inArray,实际测试jQuery的inArray,并比较苹果和苹果(调用函数来调用函数 - 你可以在性能的地方内联写入循环是非常至关重要,但这不是你的默认行动,大概是):http://jsperf.com/inarraytest/3

准备HTML:

<script src="//ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
<script>

准备代码:

var arr=[0,1,2,3,4,5,6,7,8,9];

function arrayLoop(elem, array, i) {
    var len = array.length;
    i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0;
    for ( ; i < len; i++ ) {
        // Skip accessing in sparse arrays
        if ( i in array && array[ i ] === elem ) {
            return i;
        }
    }
    return -1;
}

试验:

// jQuery.inArray last
var rtn=jQuery.inArray(9,arr);

// arrayLoop last
var rtn = arrayLoop(9,arr);

// jQuery.inArray middle
var rtn=jQuery.inArray(4,arr);

// arrayLoop middle
var rtn = arrayLoop(4,arr);

// jQuery.inArray first
var rtn=jQuery.inArray(0,arr);

// arrayLoop first
var rtn = arrayLoop(0,arr);

Chrome上的结果(indexOfjQuery.inArray总是比arrayLoop快(在第一对测试用例中,我们正在搜索最后一个条目, 戏剧性地所以。)

IE6上的结果(没有indexOf):jQuery.inArray总是比arrayLoop快,但不足为奇(因为它必须做同样的工作) - 奇怪的是,在我们在数组中搜索第一个条目的情况下,在这种情况下它会更快。

答案 1 :(得分:3)

你正在做的只是同一个jQuery $ .inArray代码的一部分,当然,当你拿一段代码并单独测试这个功能时它会更快。检查在实际迭代列表之前验证的所有条件以查找元素。

这是简单循环和$ .inArray()之间的额外时间。

最后:如果你肯定知道以下内容,你可以坚持使用简单的循环,

  1. 输入始终是数组
  2. 选择发送开始索引以加快搜索速度。
  3. 使用本机浏览器indexOf函数。