jQuery的Each比JS原生for循環(huán)性能慢很多的原因
來源:易賢網(wǎng) 閱讀:680 次 日期:2016-07-26 14:34:13
溫馨提示:易賢網(wǎng)小編為您整理了“jQuery的Each比JS原生for循環(huán)性能慢很多的原因”,方便廣大網(wǎng)友查閱!

這篇文章主要介紹了jQuery的Each比JS原生for循環(huán)性能慢很多的原因的相關(guān)資料,需要的朋友可以參考下

其實(shí)查看jQuery的源代碼,發(fā)現(xiàn)each的代碼很簡單,但為什么性能和原生的for循環(huán)相差幾十倍呢?

jQuery的each的核心代碼

for (; i < length; i++) {

value = callback.call(obj[i], i, obj[i]);

if (value === false) {

break;

}

}

看著很簡單,但為什么會(huì)慢很多呢?

編寫測試代碼如下:

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)));

}

運(yùn)行測試,發(fā)現(xiàn),第一個(gè)和第二個(gè)相差不是很大,這說明由于break這個(gè)判斷導(dǎo)致的性能差異很少,但第二個(gè)和第三個(gè),第四個(gè)偏差就就不止一倍了,而第二個(gè)和第三個(gè)唯一的區(qū)別就是調(diào)用了call,看來call會(huì)導(dǎo)致性能損失,因?yàn)閏all會(huì)切換上下文,當(dāng)然jQuery的each慢還有其他原因,它還在循環(huán)中調(diào)用了其他的方法,call只是一個(gè)原因罷了。

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

下面在通過一段代碼看下jquery的each和js原生for循環(huán)性能對(duì)比

<html xmlns="http://www.w3.org/1999/xhtml">

<head runat="server">

<title>for與each性能比較</title>

<script src="../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循環(huán)執(zhí)行時(shí)間:" + (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循環(huán)執(zhí)行時(shí)間:" + (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循環(huán)執(zhí)行時(shí)間:1

each循環(huán)執(zhí)行時(shí)間:3

兩次結(jié)果直接說明了問題。

以上所述是小編給大家介紹的jQuery的Each比JS原生for循環(huán)性能慢很多的原因,希望對(duì)大家有所幫助

更多信息請(qǐng)查看網(wǎng)絡(luò)編程
易賢網(wǎng)手機(jī)網(wǎng)站地址:jQuery的Each比JS原生for循環(huán)性能慢很多的原因
由于各方面情況的不斷調(diào)整與變化,易賢網(wǎng)提供的所有考試信息和咨詢回復(fù)僅供參考,敬請(qǐng)考生以權(quán)威部門公布的正式信息和咨詢?yōu)闇?zhǔn)!
關(guān)于我們 | 聯(lián)系我們 | 人才招聘 | 網(wǎng)站聲明 | 網(wǎng)站幫助 | 非正式的簡要咨詢 | 簡要咨詢須知 | 加入群交流 | 手機(jī)站點(diǎn) | 投訴建議
工業(yè)和信息化部備案號(hào):滇ICP備2023014141號(hào)-1 云南省教育廳備案號(hào):云教ICP備0901021 滇公網(wǎng)安備53010202001879號(hào) 人力資源服務(wù)許可證:(云)人服證字(2023)第0102001523號(hào)
云南網(wǎng)警備案專用圖標(biāo)
聯(lián)系電話:0871-65317125(9:00—18:00) 獲取招聘考試信息及咨詢關(guān)注公眾號(hào):hfpxwx
咨詢QQ:526150442(9:00—18:00)版權(quán)所有:易賢網(wǎng)
云南網(wǎng)警報(bào)警專用圖標(biāo)