`

web前端优化之dom篇(转)

 
阅读更多
很多人讨论js一些算法和使用习惯对执行效率的影响。
但是本人认为随着浏览器的优化,单纯js代码本身的优化对这个应用的影响微不足道(因为我们的js代码一般构不成一定的数量级,但是对字符串的操作是一个特例),更多的要考虑的应该是资源文件的大小和对dom操作的优化上。
比起资源下载的耗时和dom的耗时,js执行时间是微乎其微,可优化的空间的很小,js的结构应该是以可读性和可维护行为先,如果为了百分之一秒不到的时间,牺牲了可读性就得不偿失了。

dom操作篇

dom最常见的操作就是创建、添加、查找、和修改(删除)元素,下面就来比较几种添加方式的效率。
先举个例子:
    for(var i=0; i<1000; i++){
        var p = document.createElement("p");
        document.body.appendChild(p);
    }
在ie9下的执行结果20ms,在ff下的执行结果93ms,这难道就是传说中的ie9的神速吗?
不急,接着往下看,把它稍加改造。
    for(var i=0; i<1000; i++){
        var p = document.createElement("p");
        p.innerHTML = "this is p";
        document.body.appendChild(p);
    }
运行结果 ie9 153ms,ff 135ms。
原来页面只append空的p,ie是不进行渲染的,因此是“神速的”。
append一个堆空元素,对我们来说意义不大,下面的例子更符合实际,让我们开始优化之旅。
我还在此实验了把document和body的局部化,但是提升很小,也证明了我开始说明的问题。

优化1,使用DocumentFragment
    var fm = document.createDocumentFragment();
    for(var i=0; i<1000; i++){
        var p = document.createElement("p");
        p.innerHTML = "this is p<br>this is p";
        //p.innerHTML += "<br>this is p";
        fm.appendChild(p);
    }
    document.body.appendChild(fm);
运行结果 ie9 159ms,ff 94ms。
可以看出在ie下并没有减少,但是在ff下的效果还是明显的,因为我们每append一个元素到dom中,页面都会进行一次重绘,而使用 DocumentFragment,我们先将元素都添加到一个临时的dom结构片段中,此时页面并没有变化节约了重绘的时间,然后将整个fragment 一次插入dom中,整个过程只进行了一下重绘。
如果我们要添加的结构只有一个跟节点,可以用这个根节点代替DocumentFragment,直接把所有子节点append到根节点最后后把根节点插入到dom结构中。
如:var rootEl = document.createElement("div");
    ...
    document.body.appendChild(rootEl);
在ff中时间可以减少到43ms

优化2,使用innerHTML
如果不是必需使用到每个节点的引用,我们可以用innerHTML让浏览器自己解析文档结构。
    var rootDiv = document.createElement("div");
    var html = "";
    for(var i=0; i<1000; i++){
        html += "<p>this is p<br>this is p</p>";
    }
    rootDiv.innerHTML = html;
    document.body.appendChild(rootDiv);
运行结果  ie9 21ms,ff 16ms。
果然时间减少了很多,ie9一直居高不下的时间也一下回到了解放前,看来这才是对ie9浏览器的杀手锏。
我对此优化的推断是,直接赋值innerhHTML最大的减少了js引擎和浏览器渲染引擎之间的交互,看来js引擎和浏览器渲染引擎的交互次数才是最大的杀手。
此处还可以用数组来操作字符串的拼接。
    var rootDiv = document.createElement("div");
    var html = [];
    for(var i=0; i<1000; i++){
        html.push("<p>this is p<br>this is p</p>");
    }
    rootDiv.innerHTML = html.join('');
    document.body.appendChild(rootDiv);
ie9的平均时间可以达到17ms,ff没有什么变化,据说部分浏览器在字符串拼接上已经进行了优化,也许ff已经优化过来。
同时也反映了我开始的观点,js本身的操作对性能的影响是很小的。

总结一下dom方面的优化就是,尽量减少页面的重绘次数和js与dom的交互次数。
分享到:
评论

相关推荐

    web前端性能优化

    针对web前端性能低下的问题,王成、李少元、郑黎晓、缑锦、曾梅琴、刘慧敏等学者系统地提出了一套旨在提高网页加载速度、呈现速度和用户体验的完整Web前端性能优化解决方案。该方案涵盖了服务器端优化、HTML优化、...

    Web 前端性能优化思路与学习方法

    Web前端性能优化是提升网页用户体验和确保网站成功的关键因素之一。性能优化涉及多个方面,包括但不限于代码优化、资源加载策略、服务器配置等。本篇内容将深入探讨Web前端性能优化的思路与学习方法,结合WebQQ、QQ...

    web前端优化方案

    web前端优化方案的知识点包括: 一、减少HTTP请求 HTTP协议无状态,每次请求都需要建立通信链路并传输数据,服务端需要为每个HTTP请求启动独立线程处理。通信和服务开销昂贵,因此减少HTTP请求可以有效提升访问性能...

    Web前端性能优化全攻略

    Web前端性能优化是提高网页加载速度和用户体验的关键因素。Yahoo! 的 Exceptional Performance team 提出了一系列不断更新的优化策略,从最初的13条发展到现在的34条,涵盖了多个角度,包括内容、服务器、Cookie、...

    前端 - 郭碧青《Web 前端性能优化思路与学习方法》.pdf

    郭碧青是腾讯公司的一位资深前端工程师,他在Web前端性能优化方面有着丰富的实践经验,并且对于性能优化的工作充满热情。郭碧青在行业内的知名度很高,虽然行事低调,但是经常受邀在各种大型会议和技术活动中分享...

    web前端优化方法

    Web前端优化是提升网站性能和用户体验的关键步骤,它涉及到页面加载速度、资源利用率以及页面的交互体验等多个方面。以下是对标题和描述中提及的优化方法的详细解释: 1. **避免坏的请求**:确保所有资源(如图片、...

    让你页面速度飞起来 Web前端性能优化(视频教程+ppt)

    ### Web前端性能优化知识点 #### 一、构建优化 **1.1 文件压缩与合并** - **文件压缩**:利用工具如UglifyJS、Terser等对JavaScript、CSS等静态资源进行压缩,减少文件体积,从而加快加载速度。 - **文件合并**:...

    WEB前端性能优化测试

    9. **优化DOM结构**:保持DOM结构简洁,避免过多嵌套,减少计算和遍历DOM的时间。 10. **YSLOW工具**:由Yahoo!开发的YSLOW是Firefox和Chrome的插件,它根据Yahoo!的前端性能最佳实践规则对网页进行评分,并提供...

    WEB前端工程师Web前端性能优化经验分享

    Web前端性能优化是提升网页加载速度和用户体验的关键环节。这篇经验分享主要涵盖了四个核心知识点,旨在帮助前端开发者理解和实践性能优化技巧。 1. 减少HTTP请求 HTTP请求是浏览器与服务器交互的基础,但每一次...

    Web前端开发中级样题一理+实.zip

    【标题】"Web前端开发中级样题一理+实.zip" 涵盖了Web前端开发的理论与实践,这是一份针对1+x Web前端开发技能等级考试的中期练习题目集合。1+x标准旨在衡量和提升学员在Web前端领域的专业技能,确保他们具备企业级...

    前端性能优化探索.pdf

    随着互联网技术的快速发展,Web前端技术也逐渐成为了互联网开发的重要一环。然而,在如今这个追求极致体验的时代,我们不仅要实现业务需求,更需要考虑如何优化用户体验,提升页面性能。本文将从JavaScript、React、...

    web前端笔试题面试题汇总+前端优化总结

    "前端笔试题面试题汇总+前端优化总结" 前端优化的目的是什么?从用户角度而言,优化能够让页面加载得更快、对用户的操作响应得更及时,能够给用户提供更为友好的体验。从服务商角度而言,优化能够减少页面请求数、...

    web前端优化知识总结+笔试+面试总结.pdf

    Web 前端优化知识总结 本文总结了 Web 前端优化的知识点,涵盖了页面级别和代码级别的优化方法。优化的目的是提高用户体验和节省资源利用。页面级别的优化方法包括减少 HTTP 请求数、合理设置 HTTP 缓存、资源合并...

    Web前端大作业.zip

    JavaScript是Web前端的核心技术之一,通过它,我们可以实现表单验证、页面动画、异步数据请求等功能。 6. **Shopping**:可能是购物车相关的功能模块,可能包含购物车逻辑、结算流程等。 7. **register**:用户...

    Web前端开发初级样题一理+实.zip

    【标题】"Web前端开发初级样题一理+实.zip" 涵盖了Web前端开发的初级理论和实践知识,是针对“1+x WEB前端开发初级考试”的备考资料。这个压缩包很可能是为了帮助初学者或者准备参加该级别认证考试的人员进行系统性...

    web前端开发技术储久良第三版答案

    《Web前端开发技术储久良第三版答案》涵盖了前端开发领域的关键知识点,主要针对储久良教授编著的教材第三版中的习题和实验提供了详尽的解答。这本书旨在帮助学习者深入理解Web前端开发的核心概念和技术,通过解决...

    web前端优化技巧1

    本文将深入探讨“web前端优化技巧1”中的关键知识点,并提供实用的优化策略。 首先,减少HTTP请求(Make Fewer HTTP Requests)是优化的核心。每个HTTP请求都会增加页面加载的时间,因为浏览器需要等待服务器的响应...

    大巧不工-WEB前端设计修炼之道

    《大巧不工 - WEB前端设计修炼之道》是一本深入探讨WEB前端开发技术与设计理念的专业书籍。这本书旨在帮助读者理解并掌握如何通过巧妙的设计和高效的技术实现,打造出优秀的WEB前端项目。以下是对其中核心知识点的...

    j2EE 缓存 Web前端优化 后台 服务器优化

    1. **浏览器缓存(Web前端优化)** - **减少HTTP请求**:通过合并CSS和JavaScript文件,减少HTTP请求次数,从而加快页面加载速度。 - **减少DNS查找**:DNS查找会消耗时间,通过预加载DNS或使用CDN(内容分发网络...

Global site tag (gtag.js) - Google Analytics