在Web2.0和RIA大行其道的今天,JavaScript应用越来越广泛,很多的前端的用户体验效果,都是依赖JS特效来实现。 同时,JS的框架也是百花齐放,老牌的prototype, 最受开发者喜爱的灵巧的jQuery ,新锐JS框架Mootool,得到雅虎力推的YUI,最适合企业应用系统开发的EXTJS等等,一片繁荣景象。
但是,由于用户浏览器使用情况的千差万别,尤其是性能极差的不死的IE6的顽固存在,同时JS的使用已经超越了浏览器的性能极限,而开发者对于JS性能的理解还存在空白,导致JS的性能问题越来越受到人们的重视。下面就我所知道的关于JS性能方面的一些经验总结,欢迎批评指正。
1.避免Javascript加载时Block引起的阻塞
这个问题在所有的JS性能教程上都是很重要的一条了,先呈上一幅图看下阻塞的情况。
JavaScript放于头部引起的阻塞
在雅虎的高性能网页开发的14条军规中已经对这样的情况提出了解决方案。
第1条: 尽可能的减少 HTTP 的请求数 => 合并JS,减少Block的次数
第6条: 将脚本移动到底部(包括内联的)=> 减少阻塞对网页加载页面渲染的影响
第10条: 压缩 JavaScript 和 CSS (包括内联的) => 减少阻塞的时间
如果条件允许,使用JS的动态加载技术,也是一个很不错的方案
JavaScript放于尾部,减少阻塞对页面的影响
2. 尽可能的使用局部变量
//错误的代码:html()执行了100次
for (var i=0;i<100;i++){
$("#id").html( $("#id").html() + "hello" );
}
//正确的代码:html()执行了2次
var str= $("#id").html() ;
for (var i=0;i<100;i++){
str =str + "hello";
}
$("#id").html(str );
下面是测试的性能对比数据
Dom读取100次循环执行的对比数据
Dom读取1000次循环执行的对比数据
由上图可以看出,在100次循环的时候,性能对比是1ms VS 30ms, 当1000次循环的时候,性能对比是2ms VS 786 ms ,这个差距是相当惊人的。
对于Dom的操作的资源消耗是非常昂贵, Dom是用来操作,不是用来计算的。用局部变量保存这个值并用来计算,会显著提高JS的性能
3. 多使用ID选择器,少使用CSS选择器
JQ的ID选择器比CSS的选择器要快很多倍,尤其与是页面上的Dom的数量多少成反比,Dom数量越多,CSS选择器越慢
//性能差的写法
$(".title").html();
//性能好的写法
$("#test").html();
JQ CSS选择器 VS ID选择器 性能对比
从上图可以看出,1000次循环,id选择器消耗了22ms,而CSS选择器,消耗了139ms,性能相差6倍。
4. 不要轻易获取布局信息
offsetTop,offsetLeft , offsetWidth,offsetHeight,
scrollTop,scrollLeft ,scrollWidth,scrollHeight ,
clientTop,clientLeft,clientWidth,clientHeight
这些都属于布局信息,每调用一次,都会导致页面的布局的重新刷新渲染和布局计算,代价是非常高昂的,在不得不用的时候,只能通过局部变量在存储值,尽量少的去调用。特别是这种计算与定时器相关的时候,重复调用数量明显上升,尤其要注意。
循环获取定位100次2ms VS 1000次21ms
5. 使用冒泡机制减少事件绑定次数
事件绑定也同样是需要消耗资源的,可以利用冒泡和事件拦截机制,在父层绑定一次,对下层的事件进行拦截,减少绑定次数提示性能。
//不使用冒泡,绑定多次,性能较差
$("ul li").onclick(function(){
alert(this.html());
});
//使用冒泡,绑定1次,性能较好
$("ul").onclick(function(event){
alert($(event.target).html());
});
绑定父级使用冒泡机制
上图是有1000个LI的时候的性能对比, 1ms VS 63ms ,差距非常明显。使用冒泡机制还有一个好处,就是在动态新增LI的时候,无需重新事件绑定,同样减少了程序的复杂性
6. 慎用定时器
定时器(timer)是作为监听或者定时执行经常用到的,因为循环定时执行,所以其对网页的性能消耗非常的大,所以,首先要注意控制定时器的间隔时间,不可过于密集,增添客户端的压力,同时也注意尽量使用一个定时器控制多件动作,而不是每个动作一个定时器。
7. 优化效果不明显的那些技巧
在很多优化教程中,还有一些其他的技巧,但是本人测试下来,优化效果是有,但是并不是那么明显.
如: 数组的length应该先预存, if/else , switch/case 应该根据离散概率排序,而不是123顺序排序, 这些优化手段不能说没用,但是收效甚微,不如上面提到的那些手段能起到立杆见影的功效。这就是常说的,20%的努力,可以解决80%的优化问题,但是剩下的20%的优化问题,却需要80%的努力。
8.推荐的性能测试工具FireJSPT
为了做这次测试,我自己写了一个小巧的JS性能测试工具FireJSPT,“工欲善其事,必先利其器”, 已经提交到Google Code 并开源了,有兴趣的童鞋可以去看下。
9.推荐的网站性能优化方面的书
高性能网站建设指南
高性能网站建设进阶指南
高性能JavaScript
以上三本书都是网站前端性能优化方面的经典之作,不能不看,推荐下。
分享到:
相关推荐
例如第1题考察字音,第2题考察错别字,第3题考察词义辨析,第4题考察语境重音,第5题考察句子衔接,第6题考察语序逻辑,第7题则涉及到成语的正确运用,第8题为病句判断,第9题关注词语结构,第10题考查词义在特定...
1. 语文试卷结构与题型:试卷分为积累运用、标点符号使用、成语运用、语病辨析、文学常识、句子排序、汉字书写、诗词默写和语文实践活动等多个部分,全面考察学生的语文基础知识和综合能力。 2. 语文基础知识:包括...
在第一种情况,乌鸦因抵挡不住狐狸的诱惑再次失去肉;在第二种情况,乌鸦变得更聪明,不再受骗。故事的寓意是提醒我们要从错误中吸取教训,提高警惕,防止同样的错误再次发生。 总的来说,这份资料旨在帮助学生提升...
在JavaScript的世界里,轮播图切换特效是一种常见的网页动态效果,用于展示一组图片或内容,通过自动或手动切换来呈现不同的信息。"js带幻影文字效果的炫酷轮播图切换特效.zip" 提供了一个结合了文字幻影效果的轮播...
1. 语文学习方法:材料中提到的同步练习是针对九年级语文课程的,强调了学生需要对课文内容进行深入理解和实践,通过课后习题来巩固所学知识,这体现了语文学习中练习和应用的重要性。 2. 语言文字知识:题目涉及到...
第1题考查了句子逻辑顺序,强调了品味和欣赏文物到捕捉历史再到完善认知的过程。第2题考察成语的正确使用,"责无旁贷"强调个人责任,"浩如烟海"形容资料丰富,"潜移默化"表示无形中的影响,"浮光掠影"形容印象不深,...
1. **语文试题结构与题型**:标题和描述中提到的是高三语文模拟测试试题,这表明试题包含各种常见的语文题型,如选择题、填空题、翻译题、诗词鉴赏等,考察学生对文学、语言、语法、修辞等方面的综合掌握。...
1. 体系的重要性:文章指出,体系是思想完美者的自然形式,它意味着理论的完整性和观念之间的紧密联系。体系的存在确保了各种观念在一个共同的结构中相互关联,形成逻辑上的母子关系,使得整个理论系统无懈可击。 2...
1. 教育体制:描述中的“江苏省大丰区第一共同体届九年级语文上学期期中试题”表明这是中国内地初中三年级的一次语文考试,反映了中国的教育体制,尤其是地区性的教育评估体系。 2. 语文考试结构:试卷包含名句默写...
1. **读书的重要性**:朱光潜在文章中强调了读书对于获取学问和传承人类精神遗产的重要性。读书能够让我们重温人类几千年的思想经验,集中获取过去无数人的知识教训,为个人和全人类的进步提供基础。 2. **书籍的...
部分内容包含了两道语文试题的解答,第一题是词语填空,考察学生对成语的理解和运用能力。题目中通过比较“悠远”和“幽远”的区别、“记忆犹新”与“历历在目”的含义以及“浮光掠影”和“走马观花”的不同,引导...
例如,"浮光略影"应为"浮光掠影","突如奇来"应为"突如其来"。 2. 词语选用:第二题考察的是成语和词语的正确运用,需要根据语境选择合适的词语填空。如"志趣相投"形容彼此理想的契合,"跌宕起伏"形容事物或故事...
这篇文档包含了东台市第一教育联盟2017年八年级语文5月月考试卷的内容,试卷涵盖了汉字书写、诗词默写、语法修正、成语应用、句子排序以及《水浒传》的阅读理解等多方面的语文知识。试题旨在检验学生对基础知识的...
第一句中,“全靠自己是否投入”应改为“全靠自己是否投入地”,以使句子结构完整。第二句中,“无时无刻”通常与“不”连用,表达“时刻都在”的意思,应改为“无时无刻不在”。 7. 仿写句子:这道题要求学生按照...
1. 成语的使用:题目中的练习题主要考察了成语的正确使用,例如“方兴未艾”、“大放厥词”、“不绝如缕”、“见微知著”等,需要理解成语的含义、适用情境以及是否与上下文相符。 2. 成语的来源与含义:部分成语的...
【标题】和【描述】提及的是九年级语文下册第四单元关于山水画意境的作业设计,这属于语文教育范畴,而【标签】“资料”暗示这是一份教学资源。部分内容涵盖了语文基础知识,如汉字书写和词语注音,还涉及到语文实践...
本书不同于其他的理论型书籍,而是提供给读者一个动手实践的路线图。读者可以根据路线图逐步完成各部分的功能,从而避免了一开始就面对整个操作系统数万行代码时的迷茫和挫败感。书中讲解了大量在开发操作系统中需...
1. **洞若观火**:形容观察事物非常透彻,如同看到火光照亮的内部一样,表示对事物本质理解清晰。 2. **对簿公堂**:在法庭上对质,通常用于法律纠纷中。 3. **耳濡目染**:通过长时间的接触和观察,使得某种行为...
【中考语文知识清单十常考易错成语集录】是一份针对初中生复习语文考试的重要资料,涵盖了多个常见但易混淆或易错的成语。这些成语是学生在写作和阅读理解中经常遇到的,掌握它们的正确用法对于提高语文成绩至关重要...