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 相关文章推荐
JS backgroundImage控制
May 19 Javascript
自写简单JS判断是否已经弹出页面
Oct 20 Javascript
js判断是否为ie的方法小结
Jan 13 Javascript
Summernote实现图片上传功能的简单方法
Jul 11 Javascript
微信小程序 教程之列表渲染
Oct 18 Javascript
js省市区级联查询(插件版&amp;无插件版)
Mar 21 Javascript
vue2.0中vue-cli实现全选、单选计算总价格的实例代码
Jul 18 Javascript
解决vue-cli脚手架打包后vendor文件过大的问题
Sep 27 Javascript
小程序转发探索示例
Feb 19 Javascript
Mpvue中使用Vant Weapp组件库的方法步骤
May 16 Javascript
关于ES6尾调用优化的使用
Sep 11 Javascript
JavaScript代码实现微博批量取消关注功能
Feb 05 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加速器eAccelerator的配置参数、API详解
2014/05/05 PHP
php中字符集转换iconv函数使用总结
2014/10/11 PHP
PHP.ini安全配置检测工具pcc简单介绍
2015/07/02 PHP
PHP MySql增删改查的简单实例
2016/06/21 PHP
PHP实现的抓取小说网站内容功能示例
2019/06/27 PHP
pjblog修改技巧汇总
2007/03/12 Javascript
新手常遇到的一些jquery问题整理
2010/08/16 Javascript
jquery实现tr元素的上下移动示例代码
2013/12/20 Javascript
js数组如何添加json数据及js数组与json的区别
2015/10/27 Javascript
JS实现的打字机效果完整实例
2016/06/20 Javascript
利用jQuery插件imgAreaSelect实现获得选择域的图像信息
2016/12/02 Javascript
详解js前端代码异常监控
2017/01/11 Javascript
H5上传本地图片并预览功能
2017/05/08 Javascript
详解vue项目构建与实战
2017/06/27 Javascript
webpack教程之webpack.config.js配置文件
2017/07/05 Javascript
BootStrap模态框闪退问题实例代码详解
2018/12/10 Javascript
js实现QQ邮箱邮件拖拽删除功能
2020/08/27 Javascript
[02:25]DOTA2英雄基础教程 生死判决瘟疫法师
2013/12/06 DOTA
13个最常用的Python深度学习库介绍
2017/10/28 Python
python使用多进程的实例详解
2018/09/19 Python
python实现数据结构中双向循环链表操作的示例
2020/10/09 Python
HTML5的结构和语义(2):结构
2008/10/17 HTML / CSS
介绍一下write命令
2012/09/24 面试题
Structs界面控制层技术
2013/10/11 面试题
学期自我鉴定范文
2013/10/01 职场文书
总经理驾驶员岗位职责
2013/12/04 职场文书
论文诚信承诺书
2014/05/23 职场文书
危货运输企业安全生产责任书
2014/07/28 职场文书
人事经理岗位职责范本
2014/08/04 职场文书
大学生创业计划书怎么写
2014/09/15 职场文书
2014年社区重阳节活动策划方案
2014/09/16 职场文书
生产操作工岗位职责
2014/09/16 职场文书
土建技术员岗位职责
2015/04/11 职场文书
2015年新教师工作总结
2015/04/28 职场文书
致运动员加油稿
2015/07/21 职场文书
致男子1500米运动员的广播稿
2019/11/08 职场文书