mit*_*221 3 javascript performance jquery loops
我运行了一些测试,数据表明jQuery inArray()
比简单的循环慢得多.
并且array.indexOf()
甚至没有进行测试,因为我之前做过其他测试,而且表现更差.
必须有充分的理由不使用它:
for(var i=0,len=arr.length,rtn=-1;i<len;i++){
if(arr[i]==="arritem"){
rtn=i;
break;
}
}
Run Code Online (Sandbox Code Playgroud)
如果您要测试jQuery inArray
,实际测试jQuery inArray
,并比较苹果和苹果(调用函数调用函数 - 您可以在性能非常关键的地方内联编写循环,但它不是您的默认移动,据推测):http://jsperf.com/inarraytest/3
准备HTML:
<script src="//ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
<script>
Run Code Online (Sandbox Code Playgroud)
准备代码:
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;
}
Run Code Online (Sandbox Code Playgroud)
测试:
// 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);
Run Code Online (Sandbox Code Playgroud)
Chrome(有indexOf
)的结果jQuery.inArray
总是快于arrayLoop
(在第一对测试用例中,我们正在搜索最后一个条目,非常明显).
IE6上的结果(没有indexOf
):jQuery.inArray
总是快于arrayLoop
,虽然不足为奇(因为它必须完成同样的工作) - 除了奇怪的是,在我们搜索第一个条目的情况下数组,在这种情况下它更快.