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 相关文章推荐
JavaScript 自动分号插入(JavaScript synat:auto semicolon insertion)
Nov 04 Javascript
javaScript 计算两个日期的天数相差(示例代码)
Dec 27 Javascript
纯JS实现根据CSS的class选择DOM
Mar 22 Javascript
快速解决jquery.touchSwipe左右滑动和垂直滚动条冲突
Apr 15 Javascript
jQuery选择器基础入门教程
May 10 Javascript
jQuery基于扩展实现的倒计时效果
May 14 Javascript
JS中Attr的用法详解
Oct 09 Javascript
Vue 页面跳转不用router-link的实现代码
Apr 12 Javascript
vue+axios 前端实现的常用拦截的代码示例
Aug 23 Javascript
详解微信小程序网络请求接口封装实例
May 02 Javascript
layui2.0使用table+laypage实现真分页
Jul 27 Javascript
JavaScript定时器常见用法实例分析
Nov 15 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+mysql)
2007/11/23 PHP
关于PHP中Object对象的笔记分享
2011/06/28 PHP
PHP的explode和implode的使用说明
2011/07/17 PHP
Symfony2创建基于域名的路由相关示例
2016/11/14 PHP
js更优雅的兼容
2010/08/12 Javascript
将HTML的左右尖括号等转义成实体形式的两种实现方式
2014/05/04 Javascript
js实现双击图片放大单击缩小的方法
2015/02/17 Javascript
JS iFrame加载慢怎么解决
2016/05/13 Javascript
极力推荐一款小巧玲珑的可视化编辑器bootstrap-wysiwyg
2016/05/27 Javascript
JS转换HTML转义符的方法
2016/08/24 Javascript
JS图片放大效果简单实现代码
2016/09/08 Javascript
简单的JS控制button颜色随点击更改的实现方法
2017/04/17 Javascript
layui获取选中行数据的实例讲解
2018/08/19 Javascript
vue实现动态列表点击各行换色的方法
2018/09/13 Javascript
Vue+Webpack完美整合富文本编辑器TinyMce的方法
2018/11/30 Javascript
jQuery实现的简单日历组件定义与用法示例
2018/12/24 jQuery
微信小程序入口场景的问题集合与相关解决方法
2019/06/26 Javascript
JavaScript实现拖拽效果
2020/03/16 Javascript
vue 实现锚点功能操作
2020/08/10 Javascript
Python实现给文件添加内容及得到文件信息的方法
2015/05/28 Python
Python中的命令行参数解析工具之docopt详解
2017/03/27 Python
tensorflow 获取变量&amp;打印权值的实例讲解
2018/06/14 Python
pyqt5 禁止窗口最大化和禁止窗口拉伸的方法
2019/06/18 Python
奥地利票务门户网站:oeticket.com
2019/12/31 全球购物
青年教师培训方案
2014/02/06 职场文书
《忆江南》教学反思
2014/04/07 职场文书
微笑服务标语
2014/06/24 职场文书
日语系毕业求职信
2014/07/27 职场文书
2015年保送生自荐信
2015/03/24 职场文书
2015年妇联工作总结范文
2015/04/22 职场文书
团结主题班会
2015/08/13 职场文书
Angular CLI发布路径的配置项浅析
2021/03/29 Javascript
Python+Appium新手教程
2021/04/17 Python
html输入两个数实现加减乘除功能
2021/07/01 HTML / CSS
ElementUI实现el-form表单重置功能按钮
2021/07/21 Javascript
「天才王子的赤字国家重生术」妮妮姆·拉雷粘土人开订
2022/03/21 日漫