jQuery的Each比JS原生for循环性能慢很多的原因


Posted in Javascript onJuly 05, 2016

其实查看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="../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循环性能慢很多的原因,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
绑定回车enter事件代码
May 18 Javascript
JavaScript中使用arguments获得函数传参个数实例
Aug 27 Javascript
JavaScript实现在页面间传值的方法
Apr 07 Javascript
jquery validate.js表单验证入门实例(附源码)
Nov 10 Javascript
Js调用Java方法并互相传参的简单实例
Aug 11 Javascript
jQuery 利用$.ajax 时获取原生XMLHttpRequest 对象的方法
Aug 25 Javascript
js仿手机页面文件下拉刷新效果
Oct 14 Javascript
JavaScript设计模式之代理模式简单实例教程
Jul 03 Javascript
vue项目持久化存储数据的实现代码
Oct 01 Javascript
Angular中使用ng-zorro图标库部分图标不能正常显示问题
Apr 22 Javascript
详解Vue.js和layui日期控件冲突问题解决办法
Jul 25 Javascript
JS设置自定义快捷键并实现图片上下左右移动
Oct 17 Javascript
Node.js实现文件上传
Jul 05 #Javascript
JavaScript数组方法大全(推荐)
Jul 05 #Javascript
JS与HTML结合使用marquee标签实现无缝滚动效果代码
Jul 05 #Javascript
js利用正则表达式检验输入内容是否为网址
Jul 05 #Javascript
后端接收不到AngularJs中$http.post发送的数据原因分析及解决办法
Jul 05 #Javascript
微信JS-SDK坐标位置如何转换为百度地图坐标
Jul 04 #Javascript
Bootstrap实现水平排列的表单
Jul 04 #Javascript
You might like
调试PHP程序的多种方法介绍
2014/11/06 PHP
判断、添加和删除WordPress置顶文章的相关PHP函数小结
2015/12/10 PHP
使用phpexcel类实现excel导入mysql数据库功能(实例代码)
2016/05/12 PHP
tp5框架无刷新分页实现方法分析
2019/09/26 PHP
yii框架结合charjs统计上一年与当前年数据的方法示例
2020/04/04 PHP
javascript模版引擎-tmpl的bug修复与性能优化分析
2011/10/23 Javascript
jquery 实现上下滚动效果示例代码
2013/08/09 Javascript
window.print打印指定div指定网页指定区域的方法
2014/08/04 Javascript
javascript基于DOM实现省市级联下拉框的方法
2015/05/14 Javascript
C++中的string类的用法小结
2015/08/07 Javascript
理解javascript正则表达式
2016/03/08 Javascript
浅谈时钟的生成(js手写简洁代码)
2016/08/20 Javascript
JS验证不重复验证码
2017/02/10 Javascript
利用Vue.js实现求职在线之职位查询功能
2017/07/03 Javascript
vuex state及mapState的基础用法详解
2018/04/19 Javascript
vue.js学习笔记之v-bind和v-on解析
2018/05/03 Javascript
Babel 入门教程学习笔记
2018/06/13 Javascript
JavaScript碎片—函数闭包(模拟面向对象)
2019/03/13 Javascript
浅谈Javascript中的对象和继承
2019/04/19 Javascript
Vue数据驱动表单渲染,轻松搞定form表单
2019/07/19 Javascript
vue实现中部导航栏布局功能
2019/07/30 Javascript
微信小程序中悬浮窗功能的实现代码
2019/08/02 Javascript
详尽讲述用Python的Django框架测试驱动开发的教程
2015/04/22 Python
Python机器学习之决策树算法
2017/12/22 Python
Python装饰器的应用场景代码总结
2020/04/10 Python
CSS3 按钮边框动画的实现
2020/11/12 HTML / CSS
Lampegiganten丹麦:欧洲领先的照明网上商店
2018/04/25 全球购物
北美女性服装零售连锁店:maurices
2019/06/12 全球购物
浅谈react路由传参的几种方式
2021/03/23 Javascript
记者岗位职责
2014/01/06 职场文书
珍珠鸟教学反思
2014/02/01 职场文书
摄影专业毕业生求职信
2014/03/13 职场文书
卖房协议书
2014/04/11 职场文书
先进事迹材料范文
2014/12/29 职场文书
业务内勤岗位职责
2015/04/13 职场文书
Python编程中内置的NotImplemented类型的用法
2022/03/23 Python