【问题标题】:Why the jQuery inArray is too slow?为什么 jQuery inArray 太慢了?
【发布时间】:2012-01-13 23:30:05
【问题描述】:

我跑了some tests,数据点jQueryinArray()比简单循环慢很多。

array.indexOf() 甚至不在测试中,因为我之前做过其他测试,而且它的表现更差。

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

不使用它一定有充分的理由:

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

【问题讨论】:

  • 来自您的 jsperf 测试:return array.indexOf.call( array, elem, i ); ???为什么不return array.indexOf(elem, i);?为什么额外的层会通过call
  • @T.J.Crowder 我以为 jQuery 正在使用它,我从stackoverflow.com/a/8856637/1148349复制了它
  • @mithril333221 好像是,code.jquery.com/jquery-1.7.1.js
  • 如果您的目标是测试 jQuery 的 inArray,为什么不测试 jQuery 的 inArray?您可以在 jsperf 测试中包含库。
  • @ajax333221:不,这不完全一样。在 jQuery 源代码中,它引用 indexOf(一个免费符号);在 OP 的测试用例中,它引用了 array.indexOfarray 的属性)。

标签: javascript jquery performance loops


【解决方案1】:

如果你要测试 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 上的结果(有 indexOf)是 jQuery.inArray 总是比 arrayLoop 快(在第一对测试用例中,我们正在搜索最后一个条目,戏剧性地 em> 所以)。

在 IE6(没有 indexOf)上的结果:jQuery.inArray 总是比 arrayLoop 快,尽管不出所料(因为它必须做基本相同的工作)——除了,奇怪的是,在我们在数组中搜索 first 条目的情况,在这种情况下它要快得多。

【讨论】:

  • 好吧,如果我拥有 jQuery,我唯一会改变的就是使用 indexOf,它非常慢(我看不出为什么尽可能尝试使用它的原因) .感谢您的时间和测试
【解决方案2】:

您所做的只是相同 jQuery $.inArray 代码的一部分,当然,当您获取代码的 sn-p 并单独测试该功能时,它会更快。在实际遍历列表以查找元素之前检查所有已验证的条件。

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

最后:如果您确定以下内容,则可以坚持使用简单循环,

  1. 输入总是一个数组
  2. 可选择发送起始索引以加快搜索速度。
  3. 使用原生浏览器 indexOf 函数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-08
    • 2017-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多