Javascript 为什么jQuery的速度太慢?
我运行了,数据显示jQuery比简单循环慢得多 而Javascript 为什么jQuery的速度太慢?,javascript,jquery,performance,loops,Javascript,Jquery,Performance,Loops,我运行了,数据显示jQuery比简单循环慢得多 而array.indexOf()甚至不在测试中,因为我以前做过其他测试,它的性能更差 为什么要慢得多 他们为什么不使用简单的循环呢 有什么是我在监督的吗 不使用此选项必须有充分的理由: for(var i=0,len=arr.length,rtn=-1;i<len;i++){ if(arr[i]==="arritem"){ rtn=i; break; } } for(var i=0,len
array.indexOf()
甚至不在测试中,因为我以前做过其他测试,它的性能更差
- 为什么要慢得多
- 他们为什么不使用简单的循环呢
- 有什么是我在监督的吗
for(var i=0,len=arr.length,rtn=-1;i<len;i++){
if(arr[i]==="arritem"){
rtn=i;
break;
}
}
for(var i=0,len=arr.length,rtn=-1;i您所做的只是同一个jQuery$.inArray代码的一部分,当然,当您获取代码片段并单独测试该功能时,它会更快。在它实际遍历列表以查找元素之前,请检查所有已验证的条件
这是简单循环和$.inArray()之间的额外时间
最后:如果您确实了解以下内容,您可以坚持使用简单循环
输入总是一个数组
发送开始索引以加快搜索速度的选项
使用本机浏览器indexOf函数
如果您要测试jQuery的inArray
,请实际测试jQuery的inArray,并进行比较(从调用函数到调用函数-您可以在性能非常关键的地方内联编写循环,但这可能不是您的默认操作):
准备HTML:
<script src="//ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
<script>
Chrome(具有indexOf
)上的结果是jQuery。inArray
总是比ArrayLop
快(在第一对测试用例中,我们正在搜索最后一个条目,这非常明显)
IE6上的结果(没有
indexOf
):jQuery.inArray
总是比arrayLoop
快,尽管并不令人惊讶(因为它必须做基本相同的工作)-奇怪的是,在我们搜索数组中的第一个条目的情况下,搜索速度要快得多。从您的jsperf测试:返回数组.indexOf.call(array,elem,i);
??为什么不返回数组.indexOf(elem,i)
?为什么额外的层要通过调用?@T.J.Crowder我以为jQuery在使用它,我从@mithril333221复制了它似乎是,如果你的目标是测试jQuery的inaray
,为什么不测试jQuery的inaray
?你可以在jsperf测试中包括库。@ajax333221:不,那不完全一样。在jQuery源代码,它引用了indexOf
(一个自由符号);在OP的测试用例中,它引用了array.indexOf
(array
的一个属性)。好吧,如果我拥有jQuery,我唯一会改变的事情就是使用indexOf
,它非常慢(我看不出有什么理由在可能的情况下尝试使用它).谢谢你的时间和测试
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);