有关js性能总结(一)

////////初级方案//////////////////////
1.一旦数据不再有用,最好把它的值设置为null,来释放其引用。————解除引用
2.这样做适用于大多数的全局变量和全局对象的属性,局部变量会在他们离开执行环境时自动解除引用。
3,解除一个值的引用并不是意味着自动回收该值占用的内存。解除引用的真正作用是让值脱离了执行环境,方便垃圾收集器下次运行时将其回收。

////////中级方案///////////////////////
每个函数都是对象,都会占用内存;内存中的对象越多,性能就越差。
1.对于“事件处理程序过多”的解决方案:事件委托。
2.事件委托利用的事件冒泡,只指定一个事件处理程序,就可以管理某一类型的所有事件。
3.使用事件委托只需要在DOM树中尽量最高的层次上添加一个事件处理程序。
4.这样做占用的内存会更少,
最适合采用事件委托技术的事件包括:
click,mousedown,mouseup,keydown,keyup,keypress;

造成web应用程序内存与性能问题的主要原因:内存中留有那些过时不用的“空事件处理程序”。
eg:

如果知道某个元素即将被移除,最好手工移除事件处理程序

导致“空事件处理程序”的另一个情况:卸载页面的时候
解决方法:只要是通过onload事件添加的东西,最后都要通过unload事件将它们清除。

//////高级方案/////////////
1.注意作用域
访问全局变量总是要比访问局部变量慢,因为要遍历作用域链。只要能减少花费在作用域链上的时间,就能增加脚本的整体性能。
1)避免全局查找
可能优化脚本最重要的就是注意全局查找。
注意:如果在一个函数中会多次用到全局对象,就把它存储为局部变量,可以节省查找时间,从而提高性能。
2.选择正确的方法
1)避免不必要的属性查找
算法的复杂度是使用O符号来表示的,最简单,最快捷的算法是常数值O(1),之后算法变得越来越复杂,并话费更长的时间去执行。
Javascript中常见的算法类型

标记名称描述
O(1)常数不管有多少值,执行的时间都是恒定的。一般表示简单值和存储在变量中的值
O(log n)对数总的执行时间和值的数量相关,但要完成算法并不一定要获取每个值,eg:二分查找
O(n)线性总执行时间和值的数量直接相关。eg:遍历某个数组中的所有元素
O(n^2)平方总执行时间和值的数量有关,每个值至少获取n次,eg:插入排序

常数值,即O(1),指代字面值和存储在变量中的值,表示无论有多少个值,需要获取常量值的时间都一样,获取常量值是很高效的过程。

访问对象上的属性是O(n)操作,对象上的任何属性查找都要比访问变量或数组花费更长时间,因为必须在原型链中对拥有该名称的属性进行一次搜索。
属性查找的越多,执行时间就越长。
注意:一旦多次用到对象属性,应该将其存储在局部变量中,这样,第一次访问该值会是O(n),然而后续的访问都会是O(1),就会节省很多。
eg:
未存储未局部变量之前:

上面这段代码执行了6次属性查找。

存储未局部变量之后:

这段只有4次属性查找,相对之前的代码节省了33%。

评论 ( 0 )
最新评论
暂无评论

赶紧努力消灭 0 回复