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

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

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索jquery
, for循环
each
jquery 跳出each循环、jquery结束each循环、jquery each循环、jquery each循环次数、jquery each循环数组,以便于您获取更多的相关知识。

时间: 2024-09-20 21:44:05

jQuery的Each比JS原生for循环性能慢很多的原因_jquery的相关文章

js原生之焦点图转换加定时器实例_javascript技巧

在jQuery之焦点图转换-左右的基础上,将jQuery代码改成js原生,并添加定时器(setInterval()和clearInterval()) <!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <title>焦点图转换--原生和定时器</title> <link rel="stylesheet&qu

jQuery的Read()方法代替原生JS详解_jquery

在jQuery 3.0的版本前, ready经典用法是用一个匿名函数,像这样: $(document).ready(function() { // Handler for .ready() called. }); jQuery 3.0 ready() 变化 在jQuery 3.0发布之前,有以下几种方法称之为ready方法:     在document元素上操作: $(document).ready(handler);     在空元素上操作: $().ready(handler);     或

jquery属性的相关js实现方法

有些公司手机网站开发不用第三方的jquery或者zeptio,直接用原生的javascript.原生javascript功能是蛮强大的,只不过部分属性不支持IE8以下浏览器.下面对jquery相关方法,如何用js来实现,做一些简单总结. 元素操作 Add Class //JQUERY $(el).addClass(className); //js //谷歌浏览器,火狐浏览器,IE8+ if (el.classList)   el.classList.add(className); else  

jquery动态加载js三种方法

 <!-- 这里为你提供了三种动态加载js的jquery实例代码哦,由于jquery是为用户提供方便的,所以利用jquery动态加载文件只要一句话$.getscript("test.js");就ok了. <!doctype html public "-//w3c//dtd xhtml 1.0 transitional//en" "http://www.w3.org/tr/xhtml1/dtd/xhtml1-transitional.dtd&qu

jquery动态加载js三种方法实例

这里为你提供了三种动态加载js的jquery实例代码哦,由于jquery是为用户提供方便的,所以利用jquery动态加载文件只要一句话$.getScript("test.js");就OK了.   复制代码 代码如下: <!doctype html public "-//w3c//dtd xhtml 1.0 transitional//en" "http://www.w3.org/tr/xhtml1/dtd/xhtml1-transitional.dt

JQuery的$和其它JS发生冲突的快速解决方法

 本篇文章主要是对JQuery的$和其它JS发生冲突的快速解决方法进行了介绍,需要的朋友可以过来参考下,希望对大家有所帮助 众所周知,jQuery是目前最流行的JS封装包,简化了很多复杂的JS程序,JQuery讲浏览器DOM树定义为$,通过$来获取各个子节点.   然后,JS插件并非只有JQuery,还有prototype.js 等其它比较好的插件.它们也使用$.所以有时候同时使用这个两个JS插件的时候,就会出现$的使用权冲突问题.现在我们来看看如何解决这个冲突问题.请看下文:   我们都知道J

js-如果不用jquery,怎么用JS获取网页中指定标签内的选中内容?

问题描述 如果不用jquery,怎么用JS获取网页中指定标签内的选中内容? 网页有一个div,里面有些文字,鼠标选中其中一部分字,怎么能感知这一事件,然后返回选中内容. 解决方案 我在贴吧也看到类似的问题,是同一个吗? <!--支持IE9+ Firefox Chrome--> <p>这是一段测试文字</p> <script type='text/javascript'> function getSlct(){//获取选中文字 return getSelect

jquery.ztree.core-3.5.js插件怎么设计样式?

问题描述 jquery.ztree.core-3.5.js插件怎么设计样式? jquery.ztree.core-3.5.js插件怎么设计样式? 解决方案 不知道,我是来打酱油的--- 解决方案二: ztree树的 ul 标签样式在demo.css中 点进去就能看见 解决方案三: http://zhidao.baidu.com/link?url=vXVv1_vA4O4GBdwY-bGAsr_24ARDoTYnsjIeoPie2RzOhMYD_KIIN-vT2XrwTGfj6vkGif-SAcaR

浅谈JS原生Ajax,GET和POST_javascript技巧

javascript/js的ajax的GET请求: <script type="text/javascript"> /* 创建 XMLHttpRequest 对象 */ var xmlHttp; function GetXmlHttpObject(){ if (window.XMLHttpRequest){ // code for IE7+, Firefox, Chrome, Opera, Safari xmlhttp=new XMLHttpRequest(); }else