在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
以上三本书都是网站前端性能优化方面的经典之作,不能不看,推荐下。
分享到:
相关推荐
在第一种情况,乌鸦因抵挡不住狐狸的诱惑再次失去肉;在第二种情况,乌鸦变得更聪明,不再受骗。故事的寓意是提醒我们要从错误中吸取教训,提高警惕,防止同样的错误再次发生。 总的来说,这份资料旨在帮助学生提升...
在JavaScript的世界里,轮播图切换特效是一种常见的网页动态效果,用于展示一组图片或内容,通过自动或手动切换来呈现不同的信息。"js带幻影文字效果的炫酷轮播图切换特效.zip" 提供了一个结合了文字幻影效果的轮播...
本书不同于其他的理论型书籍,而是提供给读者一个动手实践的路线图。读者可以根据路线图逐步完成各部分的功能,从而避免了一开始就面对整个操作系统数万行代码时的迷茫和挫败感。书中讲解了大量在开发操作系统中需...
1. **语文试题结构与题型**:标题和描述中提到的是高三语文模拟测试试题,这表明试题包含各种常见的语文题型,如选择题、填空题、翻译题、诗词鉴赏等,考察学生对文学、语言、语法、修辞等方面的综合掌握。...
1. 体系的重要性:文章指出,体系是思想完美者的自然形式,它意味着理论的完整性和观念之间的紧密联系。体系的存在确保了各种观念在一个共同的结构中相互关联,形成逻辑上的母子关系,使得整个理论系统无懈可击。 2...
尤其是在2019至2020学年,粤教版的高中语文选修教材中,有一单元名为“今朝风流”,通过传记类课文让同学们深入理解文化与历史的内在联系,并通过实践活动如课时作业,来深化这一认知。 在这一单元的课程中,有特定...
1. **读书的重要性**:朱光潜在文章中强调了读书对于获取学问和传承人类精神遗产的重要性。读书能够让我们重温人类几千年的思想经验,集中获取过去无数人的知识教训,为个人和全人类的进步提供基础。 2. **书籍的...
部分内容包含了两道语文试题的解答,第一题是词语填空,考察学生对成语的理解和运用能力。题目中通过比较“悠远”和“幽远”的区别、“记忆犹新”与“历历在目”的含义以及“浮光掠影”和“走马观花”的不同,引导...
四川省棠湖中学2020学年高二语文下学期的第一次月考试题中涉及的关于京剧摄影的题目,不仅考察学生对这一艺术门类的理解,而且深入分析了摄影家在捕捉京剧精彩瞬间时所必备的技艺和素养。 首先,京剧摄影家要拍出有...
第一句中,“全靠自己是否投入”应改为“全靠自己是否投入地”,以使句子结构完整。第二句中,“无时无刻”通常与“不”连用,表达“时刻都在”的意思,应改为“无时无刻不在”。 7. 仿写句子:这道题要求学生按照...
【标题】和【描述】提及的是九年级语文下册第四单元关于山水画意境的作业设计,这属于语文教育范畴,而【标签】“资料”暗示这是一份教学资源。部分内容涵盖了语文基础知识,如汉字书写和词语注音,还涉及到语文实践...
1. **洞若观火**:形容观察事物非常透彻,如同看到火光照亮的内部一样,表示对事物本质理解清晰。 2. **对簿公堂**:在法庭上对质,通常用于法律纠纷中。 3. **耳濡目染**:通过长时间的接触和观察,使得某种行为...
江西省宜春市在2019-2020学年高二语文上学期第二次月考中,特别考察了学生对古代读书方法的理解与认识,以此凸显儒学背景下的读书目的和方式,以及个人修养与社会实践之间的关系。本篇试题不仅是一次学术的考核,更...
【中考语文知识清单十常考易错成语集录】是一份针对初中生复习语文考试的重要资料,涵盖了多个常见但易混淆或易错的成语。这些成语是学生在写作和阅读理解中经常遇到的,掌握它们的正确用法对于提高语文成绩至关重要...
1. 文字拼音与字形:题目中涉及到汉字的正确发音和书写,例如"嬉(xī)戏"、"瘠(jí)"、"矫(jiǎo)饰"等,这些都是语文基础知识,对于学生来说,掌握汉字的正确读音和书写是语文学习的基础。 2. 错别字辨识:...
例如第一题中,需要理解“浮光掠影”、“蜻蜓点水式”、“侃侃而谈”、“娓娓道来”、“牛刀小试”、“投石问路”、“少年老成”、“日臻成熟”等成语或短语的含义,并根据上下文选择最适合的词组。这需要学生具备...
标题提及的是“部编九年级下册语文第四单元生字词语”,这通常是指中学阶段语文教学中的一个单元,其中包含了需要学生掌握的汉字、词汇及其读音。这一单元的学习旨在帮助学生增强对汉语的理解,提高阅读、写作能力,...
1. 曾几何时:这个成语用来表示“过去没过多久”,而非“曾经”或“不知何时”。 2. 不学无术:意指“没有学问和才能”,前面不能加“整天”“整月”等修饰词,也不能将其误用为动词。 3. 不可理喻:形容“无法用...
1. 语文考试结构与题型:试卷展示了中考语文试题的构成,包括了积累运用、选择题、默写等部分,说明了语文考试的常规内容。 2. 注音与汉字:题目中涉及汉字的正确读音,如“瑕疵”的“疵”读作“cī”,“邂逅”的...