JavaScript执行效率优化及内存管理优化_第1页
JavaScript执行效率优化及内存管理优化_第2页
JavaScript执行效率优化及内存管理优化_第3页
JavaScript执行效率优化及内存管理优化_第4页
JavaScript执行效率优化及内存管理优化_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、JS执行效率及内存管理1 执行效率1.1 DOM说明:添加多个dom元素时,先将元素append到DocumentFragment中,最后统一将DocumentFragment添加到页面。该做法可以减少页面渲染dom元素的次数。经IE和Fx下测试,在append1000个元素时,效率能提高10%-30%,Fx下提升较为明显。优化前:for (var i = 0; i < 1000; i+     var el = document.createElement('p'    el.innerHT

2、ML = i;优化后:var frag = document.createDocumentFragment(;for (var i = 0; i < 1000; i+     var el = document.createElement('p'    el.innerHTML = i;    frag.appendChild(el;说明:通过一个模板dom对象cloneNode,效率比直接创建element高。性能提高不明显,约为10%左右。在低于10

3、0个元素create和append操作时,没有优势。优化前:var frag = document.createDocumentFragment(;for (var i = 0; i < 1000; i+     var el = document.createElement('p'    el.innerHTML = i;    frag.appendChild(el;优化后:var frag = document.createDocumentFrag

4、ment(;var pEl = document.getElementsByTagName('p'0;for (var i = 0; i < 1000; i+     var el = pEl.cloneNode(false;    el.innerHTML = i;    frag.appendChild(el;说明:根据数据构建列表样式的时候,使用设置列表容器innerHTML的方式,比构建dom元素并append到页面中的方式,效率有数量级上的提高

5、。优化前:var frag = document.createDocumentFragment(;for (var i = 0; i < 1000; i+     var el = document.createElement('p'    el.innerHTML = i;    frag.appendChild(el;优化后:var html = ;for (var i = 0; i < 1000; i+    &

6、#160;html.push('' + i + '' html.join(''说明:约能获得30%-50%的性能提高。逆向遍历时使用lastChild和previousSibling。优化前:var nodes = element.childNodes;for (var i = 0, l = nodes.length; i < l; i+ var node = nodes;优化后:var node = element.firstChild;while (node node = node.nextSibling;1.2 字符串说明:IE在对字

7、符串拼接的时候,会创建临时的String对象;经测试,在IE下,当拼接的字符串越来越大时,运行效率会急剧下降。Fx和Opera都对字符串拼接操作进行了优化;经测试,在Fx下,使用Array的join方式执行时间约为直接字符串拼接的1.4倍。优化前:var now = new Date(;var str = ''for (var i = 0; i < 10000; i+ alert(new Date( - now;优化后:var now = new Date(;var strBuffer = ;for (var i = 0; i < 10000; i+  &

8、#160;  var str = strBuffer.join(''alert(new Date( - now;1.3 循环语句说明:对数组和列表对象的遍历时,提前将length保存到局部变量中,避免在循环的每一步重复取值。优化前:var list = document.getElementsByTagName('p'for (var i = 0; i < list.length; i+     优化后:var list = document.getElementsByTagName('p

9、'for (var i = 0, l = list.length; i < l; i+     说明:该方法可以减少局部变量的使用。比起效率优化,更能直接看到的是字符数量的优化。该做法有程序员强迫症的嫌疑(= =!)。优化前:var arr = 1,2,3,4,5,6,7;var sum = 0;for (var i = 0, l = arr.length; i < l; i+     sum += arr;    优化后:var arr = 1,2,3,

10、4,5,6,7;var sum = 0, l = arr.length;while (l-     sum += arrl;1.4 条件分支说明:可以减少解释器对条件的探测次数。说明:switch分支选择的效率高于if,在IE下尤为明显。4分支的测试,IE下switch的执行时间约为if的一半。优化前:if (a > b num = a; else num = b;优化后:num = a > b ? a : b;1.5 定时器说明:setTimeout每一次都会初始化一个定时器。setInterval只会在开始的时候初始化一个定时器优化前:v

11、ar timeoutTimes = 0;function timeout (     timeoutTimes+;    if (timeoutTimes < 10         setTimeout(timeout, 10;    timeout(;优化后:var intervalTimes = 0;function interval (     

12、intervalTimes+;    if (intervalTimes >= 10         clearInterval(interv;    var interv = setInterval(interval, 10;说明:如果把字符串作为setTimeout和setInterval的参数,浏览器会先用这个字符串构建一个function。优化前:var num = 0;setTimeout('num+',

13、 10;    优化后:var num = 0;function addNum (     num+;setTimeout(addNum, 10;1.6 其他说明:eval、Function、execScript等语句会再次使用javascript解析引擎进行解析,需要消耗大量的执行时间。说明:避免多次取值的调用开销。优化前:var h1 = element1.clientHeight + num1;var h2 = element1.clientHeight + num2;优化后:var eleHeight =

14、element1.clientHeight;var h1 = eleHeight + num1;var h2 = eleHeight + num2;说明:var a = new Array(param,param,. -> var a = var foo = new Object( -> var foo = var reg = new RegExp( -> var reg = /./说明: with虽然可以缩短代码量,但是会在运行时构造一个新的scope。OperaDev上还有这样的解释,使用with语句会使得解释器无法在语法解析阶段对代码进行优化。对此说法,无法验证。优化前

15、:property1 = 1;property2 = 2;优化后:perty1 = 1;perty2 = 2;优化前:function eventHandler (e if(!e e = window.event;优化后:function eventHandler (e e = e | window.event;优化前:if (myobj doSomething(myobj;优化后:myobj && doSomething(myobj;说明:1.    数字转换成字符串,应用"" + 1,性

16、能上:("" + > String( > .toString( > new String(;2.    浮点数转换成整型,不使用parseInt(, parseInt(是用于将字符串转换成数字,而不是浮点数和整型之间的转换,建议使用Math.floor(或者Math.round(3.    对于自定义的对象,推荐显式调用toString(。内部操作在尝试所有可能性之后,会尝试对象的toString(方法尝试能否转化为String。多用id,少用classJS在IE浏览器下的效率

17、并不好,尤其当页面很大且具有繁杂的逻辑操作时在写html时,如果使用id,JS会很快在一次遍历中找到需要的元素(无论有几个id它都会在找到第一个id后返回)。而通过class等去寻找,程序会在整个文档中一遍又一遍的去遍历,找到一个比较判断以后再去找第二个第三个非常浪费资源。2 内存管理2.1 循环引用说明:如果循环引用中包含DOM对象或者ActiveX对象,那么就会发生内存泄露。内存泄露的后果是在浏览器关闭前,即使是刷新页面,这部分内存不会被浏览器释放。简单的循环引用:var el = document.getElementById('MyElement'var func =

18、function ( el.func = func;func.element = el;但是通常不会出现这种情况。通常循环引用发生在为dom元素添加闭包作为expendo的时候。如:function init(     var el = document.getElementById('MyElement'el.onclick = function ( init(;init在执行的时候,当前上下文我们叫做context。这个时候,context引用了el,el引用了function,function引用了context。这时候形成了一个循

19、环引用。下面2种方法可以解决循环引用:优化前:function init( var el = document.getElementById('MyElement'el.onclick = function ( init(;优化后:function init( var el = document.getElementById('MyElement'el.onclick = function ( el = null;init(;将el置空,context中不包含对dom对象的引用,从而打断循环应用。如果我们需要将dom对象返回,可以用如下方法:优化前:functi

20、on init(     var el = document.getElementById('MyElement'    el.onclick = function (     return el;init(;优化后:function init( var el = document.getElementById('MyElement'el.onclick = function ( tryreturn el; finally  

21、0;  el = null;init(;优化前:function init(     var el = document.getElementById('MyElement'    el.onclick = function ( init(;优化后:function elClickHandler( function init(     var el = document.getElementById('MyElement'&

22、#160;   el.onclick = elClickHandler;init(;把function抽到新的context中,这样,function的context就不包含对el的引用,从而打断循环引用。2.2 通过javascript创建的dom对象,必须append到页面中说明:IE下,脚本创建的dom对象,如果没有append到页面中,刷新页面,这部分内存是不会回收的!示例代码:    function create (         

23、var gc = document.getElementById('GC'        for (var i = 0; i < 5000 ; i+                    var el = document.createElement('div'       

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论