jQuery的Each比JS原生for循環(huán)性能慢很多的原因
其實(shí)查看jQuery的源代碼,發(fā)現(xiàn)each的代碼很簡(jiǎn)單,但為什么性能和原生的for循環(huán)相差幾十倍呢?
jQuery的each的核心代碼
for (; i < length; i++) { value = callback.call(obj[i], i, obj[i]); if (value === false) { break; } }
看著很簡(jiǎn)單,但為什么會(huì)慢很多呢?
編寫測(cè)試代碼如下:
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)行測(cè)試,發(fā)現(xiàn),第一個(gè)和第二個(gè)相差不是很大,這說(shuō)明由于break這個(gè)判斷導(dǎo)致的性能差異很少,但第二個(gè)和第三個(gè),第四個(gè)偏差就就不止一倍了,而第二個(gè)和第三個(gè)唯一的區(qū)別就是調(diào)用了call,看來(lái)call會(huì)導(dǎo)致性能損失,因?yàn)閏all會(huì)切換上下文,當(dāng)然jQuery的each慢還有其他原因,它還在循環(huán)中調(diào)用了其他的方法,call只是一個(gè)原因罷了。
因此可以說(shuō)call,和apply都是js中比較消耗性能的方法,在性能要求嚴(yán)格時(shí),建議少用。
下面在通過(guò)一段代碼看下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="開(kāi)始比較" onclick="getSelectLength();" /></div> <div> </form> </body> </html>
輸入出入:
for循環(huán)執(zhí)行時(shí)間:1
each循環(huán)執(zhí)行時(shí)間:3
兩次結(jié)果直接說(shuō)明了問(wèn)題。
以上所述是小編給大家介紹的jQuery的Each比JS原生for循環(huán)性能慢很多的原因,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
- javascript for循環(huán)設(shè)法提高性能
- JS常用的幾種數(shù)組遍歷方式以及性能分析對(duì)比實(shí)例詳解
- JavaScript遍歷數(shù)組的三種方法map、forEach與filter實(shí)例詳解
- JS數(shù)組的遍歷方式for循環(huán)與for...in
- js中的for如何實(shí)現(xiàn)foreach中的遍歷
- JavaScript中的數(shù)組遍歷forEach()與map()方法以及兼容寫法介紹
- JavaScript forEach()遍歷函數(shù)使用及介紹
- javascript forEach通用循環(huán)遍歷方法
- JS 使用for循環(huán)遍歷子節(jié)點(diǎn)查找元素
- JavaScript中for-in遍歷方式示例介紹
- javascript for循環(huán)性能測(cè)試示例
相關(guān)文章
jQuery實(shí)現(xiàn)的自動(dòng)加載頁(yè)面功能示例
這篇文章主要介紹了jQuery實(shí)現(xiàn)的自動(dòng)加載頁(yè)面功能,結(jié)合簡(jiǎn)單實(shí)例形式分析了jQuery針對(duì)頁(yè)面元素的動(dòng)態(tài)加載與屬性操作相關(guān)技巧,需要的朋友可以參考下2016-09-09EasyUI學(xué)習(xí)之Combobox下拉列表(1)
這篇文章主要為大家詳細(xì)介紹了EasyUI學(xué)習(xí)之Combobox下拉列表的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-12-12jQuery Easyui 驗(yàn)證兩次密碼輸入是否相等
easyui是一種基于jQuery的用戶界面插件集合。接下來(lái)通過(guò)本文給大家介紹jQuery Easyui 驗(yàn)證兩次密碼輸入是否相等的相關(guān)知識(shí),感興趣的朋友一起學(xué)習(xí)吧2016-05-05jQuery實(shí)現(xiàn)一組圖片循環(huán)滾動(dòng)
這篇文章主要為大家詳細(xì)介紹了jQuery實(shí)現(xiàn)一組圖片循環(huán)滾動(dòng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01jQuery實(shí)現(xiàn)動(dòng)態(tài)給table賦值的方法示例
這篇文章主要介紹了jQuery實(shí)現(xiàn)動(dòng)態(tài)給table賦值的方法,結(jié)合具體實(shí)例形式分析了jQuery動(dòng)態(tài)操作table表格節(jié)點(diǎn)的相關(guān)技巧,需要的朋友可以參考下2017-07-07jquery導(dǎo)航制件jquery鼠標(biāo)經(jīng)過(guò)變色效果示例
這篇文章主要介紹了jquery鼠標(biāo)經(jīng)過(guò)變色效果代碼,大家參考使用吧2013-12-12jQuery中的$是什么意思及 $. 和 $().的區(qū)別
這篇文章主要介紹了jQuery中的$是什么意思及 $. 和 $().的區(qū)別,需要的朋友可以參考下2018-04-04jQuery的實(shí)例及必知重要的jQuery選擇器詳解
下面小編就為大家?guī)?lái)一篇jQuery的實(shí)例及必知重要的jQuery選擇器詳解。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-05-05jQuery ajax中使用confirm,確認(rèn)是否刪除的簡(jiǎn)單實(shí)例
下面小編就為大家?guī)?lái)一篇jQuery ajax 中使用confirm ,確認(rèn)是否刪除的簡(jiǎn)單實(shí)例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-06-06