成人精品一区二区三区中文字幕-成人精品一区二区三区-成人精品一级毛片-成人精品亚洲-日本在线视频一区二区-日本在线视频免费

導航首頁 ? 技術教程 ? jQuery的Each比JS原生for循環性能慢很多的原因
全站頭部文字 我要出現在這里
jQuery的Each比JS原生for循環性能慢很多的原因 685 2024-02-25   

其實查看jQuery的源代碼,發現each的代碼很簡單,但為什么性能和原生的for循環相差幾十倍呢?

jQuery的each的核心代碼

for (; i < length; i++) { 
value = callback.call(obj[i], i, obj[i]); 
if (value === false) { 
break; 
} 
}

看著很簡單,但為什么會慢很多呢?

編寫測試代碼如下:

var length=300000; 
function GetArr() { 
var t = []; 
for (var i = 0; i < length; i++) { 
t[i] = i; 
} 
return t; 
} 
function each1(obj, callback) { 
var i = 0; 
var length = obj.length 
for (; i < length; i++) { 
value = callback(i, obj[i]); 
/* if ( value === false ) {去掉了判斷 
break; 
}*/ 
} 
} 
function each2(obj, callback) { 
var i = 0; 
var length = obj.length 
for (; i < length; i++) { 
value = callback(i, obj[i]);/*去掉了call*/ 
if (value === false) { 
break; 
} 
} 
} 
function each3(obj, callback) { 
var i = 0; 
var length = obj.length 
for (; i < length; i++) { 
value = callback.call(obj[i], i, obj[i]);/*自己寫的call*/ 
if (value === false) { 
break; 
} 
} 
} 
function Test1() { 
var t = GetArr(); 
var date1 = new Date().getTime(); 
var lengtharr = t.length; 
var total = 0; 
each1(t, function (i, n) { 
total += n; 
}); 
var date12 = new Date().getTime(); 
console.log("1Test" + ((date12 - date1))); 
} 
function Test2() { 
var t = GetArr(); 
var date1 = new Date().getTime(); 
var total = 0; 
each2(t, function (i, n) { 
total += n; 
}); 
var date12 = new Date().getTime(); 
console.log("2Test" + ((date12 - date1))); 
} 
function Test3() { 
var t = GetArr(); 
var date1 = new Date().getTime(); 
var total = 0; 
each3(t, function (i, n) { 
total += n; 
}); 
var date12 = new Date().getTime(); 
console.log("3Test" + ((date12 - date1))); 
} 
function Test4() { 
var t = GetArr(); 
var date1 = new Date().getTime(); 
var total = 0; 
$.each(t, function (i, n) { 
total += n; 
}); 
var date12 = new Date().getTime(); 
console.log("4Test" + ((date12 - date1))); 
}

運行測試,發現,第一個和第二個相差不是很大,這說明由于break這個判斷導致的性能差異很少,但第二個和第三個,第四個偏差就就不止一倍了,而第二個和第三個唯一的區別就是調用了call,看來call會導致性能損失,因為call會切換上下文,當然jQuery的each慢還有其他原因,它還在循環中調用了其他的方法,call只是一個原因罷了。

因此可以說call,和apply都是js中比較消耗性能的方法,在性能要求嚴格時,建議少用。

下面在通過一段代碼看下jquery的each和js原生for循環性能對比

<html xmlns="http://www.w3.org/1999/xhtml"> 
<head runat="server"> 
<title>for與each性能比較</title> 
<script src="http://www.gimoo.net/t/Cks/jquery-1.7.1.min.js" type="text/javascript"></script> 
<script type="text/javascript" language="javascript"> 
function getSelectLength() { 
var time1 = new Date().getTime(); 
var len = $("#select_test").find("option").length; 
var selectObj = $("#select_test"); 
for (var i = 0; i < len; i++) { 
if (selectObj.get(0).options[i].text == "111111") { 
selectObj.get(0).options[i].selected = true; 
break; 
} 
} 
var time2 = new Date().getTime(); 
alert("for循環執行時間:" + (time2 - time1)); 
time1 = new Date().getTime(); 
$("#select_test").find("option").each(function () { 
if ($(this).text() == "111111") { 
$(this)[0].selected = true; 
} 
}); 
time2 = new Date().getTime(); 
alert("each循環執行時間:" + (time2 - time1)); 
} 
</script> 
</head> 
<body> 
<form id="form1" runat="server"> 
<div><select id="select_test"> 
<option value='1'>111111</option> 
<option value='2'>222222</option> 
<option value='3'>333333</option> 
<option value='4'>444444</option> 
<option value='5'>5</option> 
<option value='6'>6</option> 
<option value='7'>7</option> 
<option value='8'>8</option> 
<option value='9'>9</option> 
<option value='10'>10</option> 
<option value='11'>11</option> 
<option value='12'>12</option> 
<option value='13'>13</option> 
<option value='14'>14</option> 
<option value='15'>15</option> 
<option value='16'>16</option> 
<option value='17'>17</option> 
<option value='18'>18</option> 
<option value='19'>19</option> 
<option value='20'>20</option> 
</select><input type="button" value="開始比較" onclick="getSelectLength();" /></div> 
<div> 
</form> 
</body> 
</html>

輸入出入:

for循環執行時間:1
each循環執行時間:3

兩次結果直接說明了問題。

以上所述是小編給大家介紹的jQuery的Each比JS原生for循環性能慢很多的原因,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對綠夏網網站的支持!



主站蜘蛛池模板: cctv16体育台节目表| 重生2003| 谍变1939全部演员表| 帕米尔的春天简谱| 我妻子的一切 电影| 成人在线影片| av午夜| ctv5| 马会传真论坛13297соm查询官网 | 第九区电影免费观看完整版 | 汤姆·威尔金森| 烽火流金电视剧全集免费观看| 禁忌的诱惑电影| 风花电影完整版免费观看| 电影《七天》| raz分级阅读绘本| disturbia| 免费看污污的视频| 啊嗯啊嗯啊嗯| 夜夜做新郎| 寄宿公寓的女郎| 大学生国防论文2000字| 金太狼的幸福生活电影演员表介绍| 吸油记游戏破解版无限金币| 榜上有名| 六级词汇电子版| 极寒复出| 全能住宅改造王| 生理卫生课程| 花宵道中1| 周子航| 五年级语文上册第八课笔记| 陈建斌电影| 极品电影网| 自查报告| 喻繁图片| 胭脂 电视剧| 速度与激情 电影| 最可爱的人 电影| 流浪地球2视频免费播放下载| 夜半2点钟|

!!!站長長期在線接!!!

網站、小程序:定制開發/二次開發/仿制開發等

各種疑難雜癥解決/定制接口/定制采集等

站長微信:lxwl520520

站長QQ:1737366103