转自http://www.cnblogs.com/koking/archive/2011/10/17/2215665.html

   折腾了好几天,纠结了好几天,郁闷了好几天,终于在今天可以释怀了,留下其中的苦乐辛酸来和大家分享。

   事情是这样子的,上周接到一个需求,其中涉及到一个好友选择的组件,就是单机左侧某个群组下的好友后该好友移动到右侧,视为选择了它,另外每个群组还有全选,折叠和展开等功能。组件在开发过程中,遇到了在2000条数据的时候,搜索会变的很卡,IE8下为2s左右,IE6更长,我在最初的优化过程中我使用事件代理,文档片段,字符串数组,少创建对象,缓存一切可以缓存的,用hash超找代替数组查找等方式,但是一直没有找到性能的瓶颈所在,所以效果不大,后来采用了setTimeout的方式,就是限制js的执行时间,当它超过规定的时间后记录当前的执行状态,然后setTimeout延迟一段时间再执行,而把延时的这段时间交给UI线程,这样做后确实不卡了,但是因为出现延时调用,搜索的总体时间变长了,试想让用户等十多秒来看搜索的结果这样做也太不合理,问题一直没有得到根本的解决。

后来,在johnnie和youkun的帮助和提示下,我找到了优化的入口就是找性能瓶颈,就是如果一个段代码很耗时的话你可以注释掉一部分你认为是很耗时的,或者干脆全部注释掉,然后再一点一点的解开,按照这个思路,我发现在我的循环搜索中频繁进行了dom操作,就比如搜索用户提交的一个queryString,我的方法是在数据中遍历所有的item,如果匹配,就通过这条数据找到这个item对应的dom,然后显示它,不匹配就隐藏它,然后每个组搜索完还要更新该组搜索的结果数,这里面涉及到选择dom,然后显示或者隐藏它等,正是这些dom操作在大数据量的时候使得搜索操作变得很慢,当时我试验了下,就算在循环中只执行一个document.getElementById也很耗时,找到了问题的根源所在,接下来的优化就有了方向,于是在v3版本中我改变了搜索的策略,循环遍历的时候只拼接dom,在循环结束后一次性的放到文档中,经过测速,循环遍历拼接dom只用了不超过60ms,而把这一大段html放到文档中这一个操作在IE下耗时250ms左右,虽然离大师们推荐的100ms还有差距,但是相对v2的2s提升了很多,我也终于松了一口气了。
     小结:其实js优化一定要掌握方法,没有正确的方法可能做了很多工作都是偏离主题的,按照正确的优化方法来优化就会定位性能瓶颈,然后对其采取进行有效的 优化措施,而js优化中最主要的还是对dom操作的优化,单纯的js执行时间是很短的,而js和dom之间的交互是通过接口来完成,通过接口来完成的都会 有延时,所以要尽量减少dom操作,尤其是在大循环中。
     最后,总结下常见的dom操作的优化方法(节选自高性能JavaScript)

1  最小化dom访问次数,尽可能在js端执行;
     2  如果需要多次访问某个dom节点,请使用局部变量存储对它的引用;
     3  小心处理html集合,因为它实时连系着底层的文档,把集合的长度缓存到一个变量中,并在迭代中使用它,如果需要经常操作集合,建议把它拷贝到一个数组中;
     4  如果可能的话,使用速度更快的API,比如querySelectorAll和firstElementChild;
     5  要留意重绘和重排;批量修改样式时,“离线”操作dom树;使用缓存,并减少访问布局的次数;
     6  动画中使用绝对定位,使用拖放代理
     7  使用事件委托来减少事件处理器的数量

总结下js中对数据访问的优化(节选自高性能JavaScript)

1  函数中读写局部变量总是最快的,而全局变量的读取则是最慢的;
     2  尽可能地少用with 语句,因为它会增加with 语句以外的数据的访问代价;
     3  闭包尽管强大,但不可滥用,否则会影响到执行速度以及内存;
     4  嵌套的对象成员会明显影响性能,尽量少用;
     5  避免多次访问对象成员或函数中的全局变量,尽量将它们赋值给局部变量以缓存。

 
 

我所经历的JS性能优化的更多相关文章

  1. js性能优化文章集锦

    总结的js性能优化方面的小知识http://www.it165.net/pro/html/201503/35336.html 如何优化你的JS代码http://www.php100.com/html/ ...

  2. js性能优化-事件委托

    js性能优化-事件委托 考虑一个列表,在li的数量非常少的时候,为每一个li添加事件侦听当然不会存在太多性能方面的问题,但是当列表非常的长,长到上百上千甚至上万的时候(当然只是一个解释,实际工作中很少 ...

  3. js 性能优化利器:prepack

    1. js 性能优化 js 本身是没有像 python 一样的预编译功能,更没有像 java 一样的编译功能,所以,这里所说的 js 代码预编译 只是通过工具实现的类似功能而已. 这就要提到 prep ...

  4. js 性能优化 篇一

    JS性能优化 摘自:http://www.china125.com/design/js/3631.htm  首先,由于JS是一种解释型语言,执行速度要比编译型语言慢得多.(注:,Chrome是第一款内 ...

  5. JS性能优化笔记搜索整理

    通过网上查找资料了解关于性能优化方面的内容,现简单整理,仅供大家在优化的过程中参考使用,如有什么问题请及时提出,再做出相应的补充修改. 一. 让代码简洁:一些简略的表达方式也会产生很好的优化 eg:x ...

  6. js性能优化--学习笔记

    <高性能网站建设进阶指南>: 1.使用局部变量,避免深入作用域查找,局部变量是读写速度最快的:把函数中使用次数超过一次的对象属性和数组存储为局部变量是一个好方法:比如for循环中的.len ...

  7. 你不知道的Node.js性能优化,读了之后水平直线上升

    本文由云+社区发表 "当我第一次知道要这篇文章的时候,其实我是拒绝的,因为我觉得,你不能叫我写马上就写,我要有干货才行,写一些老生常谈的然后加上好多特技,那个 Node.js 性能啊好像 D ...

  8. Web篇之JS性能优化

    首先,性能优化分好几个方面,本章我们从js方面来优化. 1:垃圾收集 日常中的某些情况下垃圾收集器无法回收无用变量,导致的一个结果就是——内存使用率不断增高,以下为对应的情况以及处理方法. ①对象相互 ...

  9. Ext.js性能优化漫谈

    Ext.js是一个用于建立企业级应用的纯JS框架.毫无疑问,它为我们提供了大量的组件,比如container,panel,field,grid,这些组件使用起来很方便,不需要去写js和html,但是e ...

随机推荐

  1. luogu2038[NOIP2014 T4]无线网络发射器选址

    题目描述 随着智能手机的日益普及,人们对无线网的需求日益增大.某城市决定对城市内的公共场所覆盖无线网. 假设该城市的布局为由严格平行的129 条东西向街道和129 条南北向街道所形成的网格状,并且相邻 ...

  2. 基于jquery的消息提示框toastr.js

    //消息提示全局配置 toastr.options = { "closeButton": false,//是否配置关闭按钮 "debug": false,//是 ...

  3. HTML 学习笔记 CSS3(Animation)

    CSS3动画: 通过CSS3 我们能够创建动画 这可以在许多网页中取代动画图片 Flash动画 以及JavaScript. CSS3 @keyframes 规则如需在 CSS3 中创建动画,您需要学习 ...

  4. c++ 基于wincrypt的DES CBC模式加解密

    des.h #pragma once #include <windows.h> #include <atlstr.h> #include <wincrypt.h> ...

  5. Nginx 使用IP限制访问来源

    在 server {... 下, 或者在 location xxx {... 下, 都可以添加如下的IP访问限制 allow 10.57.22.172; allow ; allow ; allow ; ...

  6. BZOJ 1009 【HNOI2008】 GT考试

    Description 阿申准备报名参加GT考试,准考证号为N位数X1X2....Xn(0<=Xi<=9),他不希望准考证号上出现不吉利的数字.他的不吉利数学A1A2...Am(0< ...

  7. codevs 1227 方格取数 2

    Description 给出一个n*n的矩阵,每一格有一个非负整数Aij,(Aij <= 1000)现在从(1,1)出发,可以往右或者往下走,最后到达(n,n),每达到一格,把该格子的数取出来, ...

  8. 【WPF】TextBox样式重写注意事项

    1.普通控件重写需要添加一行 <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="C ...

  9. handlebars+require

    handlebars+require 最近在某网站看到了handlebars.js,出于好奇就百度了下这是神马玩意,结果让我很是欢喜,于是就开始自学下,handlebars就几个方法,蛮简单,言归正传 ...

  10. 网络/运维工程师visio2013模具图标 绘制漂亮的网络拓扑图 狮子XL工程师美学思想

    visio2013狮子XL自定义运维模具下载: 链接:http://pan.baidu.com/s/1bo779Kz 密码:xh3s 狮子XL 的美学思想: 1,一次痛苦,一生幸福. 之前,在绘制网络 ...